I代码:
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char string[]="stackflow";
strcpy(&string[0],&string[1]);
puts(string);
getch();
}结果是“粘流”。我不明白这件事。你能解释谁?提前谢谢。
发布于 2014-02-13 16:37:00
调用strcpy(&string[0],&string[1]);的意思是:将以string1地址开始的以空结尾的字符串复制到字符串的地址。这意味着您要将从偏移量1 (tackflow)开始的字符串复制到偏移量0的地址。或者换一种方式:将字符串一个字符向左移动,覆盖s。
strcpy用于将由空字节(C字符串)终止的字节数组从一个地址(第二个参数)复制到另一个地址(第一个参数)。通常,它用于将字符串从一个内存位置复制到一个完全不同的内存位置:
char string[] = "stackflow";
char copied_string[10]; // length of "stackflow" + NULL byte
strcpy(copied_string, string);
puts(copied_string);正如@PascalCuoq正确指出的那样,您的调用是未定义的行为,这意味着任何事情都可能发生。The 标准说
如果复制发生在重叠的对象之间,则行为是未定义的。
所以你很幸运,你有一个“理智的”输出。
发布于 2014-02-13 16:47:08
需要注意的一点是:strcpy的行为是未定义的(请参阅C99 7.23.2.3:2),因此,无论输出是什么样子,您正在做的事情基本上不能保证工作,除非C实现的文档声明不同。
在字符串中移动数据时使用memmove。
在声明字符串时,您也应该非常小心。您提供的代码是正确的:
char string[] = "foo";string是一个字符数组,初始化为包含四个元素:'f‘、'o’、'o‘、'\0’。
但是,非常类似的代码是不正确的:
char * string = "foo";此代码所做的是初始化指向常量字符串文本"foo“地址的指针。正确的版本是:
const char * string = "foo";如果您试图修改这样的字符串,编译器将正确地抱怨。
发布于 2014-02-13 16:30:18
strcpy是(Dest,Src)。源从位置1开始,然后转到字符串的末尾。它将按源指向的字符串复制到按目标指向的数组中,包括终止空字符(并在此点停止)。
https://stackoverflow.com/questions/21759894
复制相似问题