由while((*strDest++=*strSrc++)!='\0');所想到的

今天跟人讨论几个字符串的问题,其中之一就是strcpy函数的实现。关键代码就是while((*strDest++=*strSrc++)!='\0'),发现了三个小问题,分析如下。

1能不能改成while(*strDest++=*strSrc++)?

可以的,在vs2010下运行没有问题。因为'\0'能当false用。输入代码:

if('\0')

   printf("hehe");

单独编译运行这两行代码是没有任何输出的。

2(*strDest++=*strSrc++)!='\0'究竟是用谁的值来和'\0'比较?

char a[20];

char *str=a;

char *src=\"abcd\";

printf("%c\n",*str++=*src++);

输出的结果是字符a

*strDest++=*strSrc++整个表达式的值是‘a’。所以(*strDest++=*strSrc++)!='\0'是判断前面赋值表达式的值是否为'\0'。既不是*strDest,也不是*strSrc。

单独调试如下代码:

int a,b=2;

printf("%d\n",a=b);

输出结果为2。如果b不赋值,程序运行错误。

3 char *strDest;能直接用吗?

当然不能。

char *str;

char *src=\"abcd\";

strcpy(str,src);

printf("%s\n",str);

以上代码编译有警告,运行会出错。

如果改成

char *str="";

char *src=\"abcd\";

strcpy(str,src);

printf("%s\n",str);

运行也会出错。

解决方法是

char a[20];

char *str=a;

char *src=\"abcd\";

strcpy(str,src);

printf("%s\n",str);

这样程序能完美运行,输出结果abcd。

你可能感兴趣的:(c,字符串)