-2
int main(){
 char a[80] = "Angus Declan R";
 char b[80];
 char *p,*q;
 p = a;
 q = b;
 while(*p != '\0'){
  *q++ = *p++;
 }
 *q = '\0';
 printf("\n p:%s q:%s \n",p,q);
 puts(p); //prints the string
 puts(q); //doesnt print the string
 return 0;
}

为什么字符串没有从 p 复制到 q?尝试打印 q 时,它什么也不打印

4

5 回答 5

3

添加

p = a;
q = b;

再次之前

printf("\n p:%s q:%s \n",p,q);
 puts(p); //prints the string
 puts(q); //doesnt print the string

因为pandq指针在while循环中递增,并且它们不再指向aand bchar 数组的开头

顺便说一句,正如评论:

您可以替换此代码块

while(*p != '\0'){
  *q++ = *p++;
 }
 *q = '\0';

经过

while(*q++ = *p++); // more simple ;-)
于 2013-03-07T15:26:25.637 回答
1

puts(p); //prints the string

由于情况的特殊情况,这只是运气。p和都q位于各自字符串的末尾。

于 2013-03-07T15:29:38.220 回答
1

您必须在显示之前将指针重新定位在字符串的正确位置(因此:p=a 和 q=b)。

int main(){
 char a[80] = "Angus Declan R";
 char b[80];
 char *p,*q;
 p = a;
 q = b;
 while(*p != '\0'){
  *q++ = *p++;
 }
 *q = '\0';
 p=a;
 q=b;
 printf("\n p:%s q:%s \n",p,q);
 puts(p); //prints the string
 puts(q); //doesnt print the string
 return 0;
}

注意:您可能很幸运: puts(p); “打印字符串”可能是因为a和b是连续存储的。如果你做了类似的事情:

 char a[80] = "Angus Declan R";
 char c[80] = {"\0"}; //example
 char b[80];

看跌期权(p);也不会打印任何东西。

于 2013-03-07T15:33:31.843 回答
1

这是您修复的代码

#include <stdio.h>

int main()
{
 char a[80] = "Angus Declan R";
 char b[80];
 char *p,*q;
 p = a;
 q = b;
 while(*p != '\0')
  *q++ = *p++;
    *q++ = '\0';
 p = a;
 q = b;

 printf("\n p:%s q:%s \n",p,q);
 puts(p); 
 puts(q); 
 return 0;
}
于 2013-03-07T15:34:47.367 回答
1

字符串实际上是被复制的,你可以通过在最后输入这个 printf 语句来看到:

 printf("\n a: %s b: %s \n", a, b);

但是,您忘记了有关++操作员的一些基本信息。当你写的时候*q++ = *p++,它和写的一样:

q = q + 1;
p = p + 1;
*q = *p;

所以,在你的循环结束时, p 和 q 指向你的空字符,这显然不是你想要的。

于 2013-03-07T17:59:20.850 回答