我正在学习指针和字符串以及它们是如何工作的。我有一个问题,我可能已经知道哪个答案。但是,事实上,我想确定它。 我们以下面的代码为例:
char a[200],*p;
gets(a); // cin.get(a,200);
p=a;
strcpy(p,p+1);
printf("%s",a); // c
cout<<a; // cpp
return 0;
Input : working
Output : orking
那么这个怎么样?为什么修改数组而不实际修改自己?
char a[200],*p;
gets(a); // cin.get(a,200);
p=a;
p++;
printf("%s",a); // cout<<a;
return 0;
Input : working
Output : working
在这种情况下,为什么数组没有修改?功能 strcpy 有什么特别之处?其他哪些功能有这个优点?
在整篇文章中,我已经提到了程序中设置的字符串的功能。
答案 0 :(得分:1)
char a[200],*p;
将一个包含200个字符的a
块和一个指针p
定义为一个或多个字符的块。
gets(a); // cin.get(a,200);
将一些用户输入读入内存块a
p=a;
第p
栏的a
点数。 p
现在可以用作与a
strcpy(p,p+1);
将部分内存块复制到自身上。注意:这会调用未定义的行为,因为strcpy
中的to和from缓冲区重叠(请参阅http://en.cppreference.com/w/cpp/string/byte/strcpy)。结果可能不同寻常,范围从“看起来像它的作品!”更加精彩,比如计算机让雨水独角兽。
因此,在内存位置10创建a
。数据从位置10开始读入块。然后p
设置为指向位置10。然后,从位置10开始,将从位置11开始的存储器复制到存储器上。由于a
为10,打印a
将打印更改的数据。由于p
仍然指向10,因此打印p
将打印与a
相同的内容。
char a[200],*p;
将一个包含200个字符的a
块和一个指针p
定义为一个或多个字符的块。
gets(a); // cin.get(a,200);
将一些用户输入读入内存块a
p=a;
第p
栏的a
点数。 p
现在可以用作与a
p++;
移动p
指向右侧的一个插槽。什么都没复制。刚刚更改了p
指向的地址。
因此,在内存位置10创建a
。数据从位置10开始读入块。然后p
设置为指向位置10.然后p
为设置为指向内存位置11.内存块a
中的值保持不变。由于a
仍为10,因此打印a
会打印未更改的数据。由于p
现在指向11,因此打印p
将从a
的第二个字符开始打印。
答案 1 :(得分:0)
您没有修改第二个代码中的任何内容。为什么要修改? 钢琴指向a的第一个元素。然后你递增它。所以请指向第二个元素。然后你打印一个没有修改过的人。
至于第一个,来自strcpy参考:
{{1}}
我认为你有所谓的重叠。 您将源复制到内存中重叠的目标。