-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

pおよびqポインターはループ内でインクリメントされ、およびchar 配列whileの先頭を指していないためです。ab

ところで、ちょうど発言:

このコードブロックを置き換えることができます

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

これが修正されたコードです

#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 に答える
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];

puts(p); 同様に何も印刷しないでしょう。

于 2013-03-07T15:33:31.843 に答える