以下是将一个字符串复制到另一个字符串的程序。我希望以下程序能给我一个警告或错误,但它只是工作。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void strcp(const char *source,char *dest)
{
while(*source!='\0')
{
*dest++=*source++;
}
// *dest='\0';
}
int main(void)
{
char source[]="This is a test string";
int len=strlen(source);
char *dest = (char *)calloc(len,sizeof(char));
strcp(source,dest);
printf("\n The destination now contains ");
printf("%s",dest);
return 0;
}
我在这里评论过*dest='\0'
所以*dest
在字符串的末尾不包含任何空字符
但是主函数中的printf
语句如何工作正常呢?我猜所有涉及字符串的函数都依赖于'\0'
字符来标记字符串的结尾?
P.S。我得到了我的第一个问题的答案,但没有一个答案在下面谈到这个问题
而且我发现奇怪的是我可以直接使用指针dest
与%s
printf
中的char *temp=dest
while(*temp!='\0')
{
printf("%c",*test++);
}
说明符我刚写完主要内容中的最后一个printf来检查它是否有效可以提前导致我正在使用
printf("%s",dest)
取代doc["mentioning"].values.length
答案 0 :(得分:4)
因为未定义的行为未定义?
通过省略终止'\0'
,然后将“ string ”传递给printf()
"%s"
说明符,您的程序将调用未定义的行为。
我在上面写了“ string ”,因为没有终止'\0'
它不是一个字符串,它只是一个字节序列,当你用{{1来终止一个字节序列时然后,它变成一个字符串。
由于你无法预测会发生什么,可能发生的一件事就是它有效。
虽然你的程序有更多问题
您分配的空间少于所需的空间。您需要'\0'
,因为strlen() + 1
终止符,这是程序中未定义行为的真正原因。
您正在调用'\0'
错误,应该是
calloc()
请注意,我不会写dest = calloc(1, 1 + len);
,因为它是超级的,它总是sizeof(char)
,它必须符合c标准的要求。
在您的版本中,当您确实需要1
尺寸为len
的项目时,您将分配一个尺寸为len
的项目。
备注和建议:
在这种情况下不要使用1
,您不需要将所有项初始化为0,因为您要立即覆盖它们,并且使用calloc()
可能会隐藏内存中的错误调试器。
答案 1 :(得分:2)
C中的所有字符串都有一个特殊的终止字符'\0'
,使用strlen
时不会计算。但是,所有字符串仍必须具有此特殊终止字符,否则所有字符串函数都将超过字符串的末尾。
为字符串分配内存时,需要为此终止字符添加空间,并最后添加它。
因此,您需要分配len
个字符,而不是仅分配len + 1
个字符。并删除strcp
函数中的注释,需要添加终结符。