我试图使用strncpy
然后strcpy
,反之亦然,但我在运行时不断收到分段错误。我以为这是因为函数中的逻辑错误,但我切换了它们的位置,只有第一个会执行。
#include <stdio.h>
#include <string.h>
int main(void)
{
char c = ' ', sentence[50], *pointer_to_string;
pointer_to_string = &sentence[0];
int index = 0;
printf("Please enter a sentence:");
while ((c = getchar()) != 'n')
{
sentence[index] = c;
index++;
}
sentence[index] = ' ';
char *string_copy1, *string_copy2;
strncpy(string_copy1, pointer_to_string, 5);
printf("strncpy(string_copy1, pointer_to_string, 5):n");
printf("%sn", string_copy1);
strcpy(string_copy2, pointer_to_string);
printf("strcpy(string_copy2, pointer_to_string):n");
printf("%sn", string_copy2);
}
请参阅文档:
char *strcpy(char *dest, const char *src);
第一个参数是指向目标缓冲区的指针。但是您的指针未初始化:
char *string_copy1, *string_copy2;
因此,指针包含一些垃圾值。strcpy()
写入不属于您的程序的内存。它会导致分段错误。
做
char string_copy1[50] = { 0 };
char string_copy2[50] = { 0 };
用零填充它们是必要的,以避免strncpy()
问题:
如果
src
的前n
个字节中没有空字节,则放置在 dest 中的字符串将不会以 null 结尾。