问题描述
我正在测试一些 string.h
函数,并在使用函数 strncpy
和 strncat
时发现了一个奇怪的行为。
#include <stdio.h>
#include <string.h>
int main()
{
char name1[30],name2[30],name3[30],name4[30],name5[30];
char *res;
printf("First name: ");
scanf("%[^\n]",name1);
setbuf(stdin,NULL);
printf("\nSecond name: ");
scanf("%[^\n]",name2);
strcpy(name3,name2);
printf("\nname3: %s",name3);
strncpy(name4,name3,5);
printf("\nname4: %s",name4);
//printf("\nSize of first name: %zu",strlen(nome1)); //zu para size_t
//printf("\nTamanho do segundo nome: %d",(int) strlen(nome2));
strncpy(name5,name1,3);
printf("\nname1: %s",name1);
printf("\nname2: %s",name3);
printf("\nname4: %s",name4);
printf("\nname5: %s",name5);
strcat(name1,name2);
printf("\nname1: %s",name1);
strncat(name4,name5,3);
printf("\nname4: %s",name4);
return 0;
}
First name: apple
Second name: elefant
name3: elefant
name4: elefa
name1: apple
name2: elefant
name3: elefant
name4: elefa
name5: app|�
name1: appleelefant
name4: elefaapp
为什么 name5
得到 app|�
而不是仅仅得到 app
?此外,有时我会得到最后一个 name4
,即 name4
与 name5
的串联,作为 elefaapp|�
。谁能解释一下这种奇怪的行为吗?
解决方法
来自文档:
https://www.cplusplus.com/reference/cstring/strncpy/
如果 source 长于 num,则不会在目标末尾隐式附加空字符。因此,在这种情况下,destination 不应被视为以空字符结尾的 C 字符串(这样读取它会溢出)。
一般情况下,使用'\0'
时需要手动添加一个strncpy
来终止字符串