标题:c语言笔试题,大虾们解释下!
只看楼主
dezhengwei
Rank: 2
来 自:东华大学
等 级:论坛游民
帖 子:33
专家分:13
注 册:2008-12-16
结帖率:77.78%
已结贴  问题点数:20 回复次数:9 
c语言笔试题,大虾们解释下!
实现一个函数strprintf(int n,char *s1){}
n代表参数*s1的个数,*s1为指向字符串的指针。
函数输出*s1字符串。
比如:strprintf(1,"hello")  输出结果为hello.
      strprintf (3,"this","is","a dog")  输出结果为this is a dog.
提示:考虑系统编译,用指针实现!
我想了半天都觉得题目不对,是考的c语言,怎么会有重载了呢?
搜索更多相关主题的帖子: 笔试 解释 c语言 
2009-08-28 11:57
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
得分:0 
strprintf(int n,char *p,...)
 {
   int i,len=0;
   for(i=0;i<n;i++,p+=len)
    {
     printf("%s ",p);
     len=strlen(p)+1;
    }
   printf("\n");
 }

 main()
 {
  int n;
  char *p="this",*p1="is",*p2="a dog";
  n=1;
  strprintf(n,p);   /*这里带两参数*/
  n=3;
  strprintf(n,p,p1,p2); /*这里带四参数*/
 }
我的这个strprintf函数符合你的题目。

努力—前进—变老—退休—入土
2009-08-28 14:15
zh370213
Rank: 2
等 级:论坛游民
帖 子:2
专家分:15
注 册:2009-8-28
得分:15 
楼上的朋友,如果你把main()函数中的
char *p="this",*p1="is",*p2="a dog"; 

改成
char *p="this",*p3="abc",*p1="is",*p4="def",*p2="a dog"; 

你的函数还能正常工作吗?
或者改成:
char *p1="is",p*="this",*p2="a dog"; 

还能完成规定的任务吗?
你的函数之所以能完成任务,其实是一个假象。静态内存中有一块专门的区域,它用于存放代码中所出现的所有的字符串。你的三个指针正好是按顺序声明的,因此,p、p1、p2所代表的字符串在那块内存中也是按顺序存放的。而你的strprintf函数,其实就是从形参p指向的字符串开始,依次输出后面的字符串。一旦声明指针时,指针的相对位置发生改变,你的函数就没法完成规定的功能。
2009-08-28 16:26
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
得分:5 
能骗过老师。
我的那函数是有问题,就是你说的问题。
下面这个是正确的,从另边复制过来的strprintf函数,套上主函数如下。
#include<stdarg.h>
void strprintf(int n,...)
{
    int i=1;
    va_list va;
    va_start(va,n);
    while(i++<=n)
        printf("%s ",va_arg(va,char*));
    printf("\n");
    va_end(va);
}
 main()
 {
  int n;
  char *p="this",*p1="is",*p2="a dog";
  /*n=1;
  strprintf(n,p);*/
  n=3;
  strprintf(n,p,p1,p2);
 }
这样就没问题了。。

[ 本帖最后由 UserYuH 于 2009-8-28 16:39 编辑 ]

努力—前进—变老—退休—入土
2009-08-28 16:31
zh370213
Rank: 2
等 级:论坛游民
帖 子:2
专家分:15
注 册:2009-8-28
得分:0 
这种可变参数函数的题目,我想应该不会是学校的老师出出来的。
不过用来骗老师那是足够了。
2009-08-28 16:41
dezhengwei
Rank: 2
来 自:东华大学
等 级:论坛游民
帖 子:33
专家分:13
注 册:2008-12-16
得分:0 
UserYuH很好,    zh370213很好,很强大!
非常谢谢!
2009-09-09 13:03
dezhengwei
Rank: 2
来 自:东华大学
等 级:论坛游民
帖 子:33
专家分:13
注 册:2008-12-16
得分:0 
回复 4楼 UserYuH
可变参数的题确实不是老师出的,去了一面试单位,发现了学校的老师太水了,这块提都没提
2009-09-09 13:14
迷途流浪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:20
专家分:139
注 册:2009-9-6
得分:0 

#include "stdio.h"
 
 
void sprintf(int n,const char*p,...)
{
     
    for(int i=0;i<n;i++)
    {
        printf("%s ",*(&p+i*0x1));
    }
 
    printf("\n");
}
 
int main(int argc, char* argv[])
{
     
    sprintf(3,"hello","ccdd","bb");
 
 
    return 0;
}
看看符合要求吗?
记得通知我一声!!
2009-09-09 20:03
迷途流浪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:20
专家分:139
注 册:2009-9-6
得分:0 
存在很多BUG,不是很完善,看看思路对不?
2009-09-09 20:05
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
没有参数正确性检查 乱调传参数容易使程序崩溃

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2009-09-09 20:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-283947-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016056 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved