strcpy 不能正确处理字符数组

问题描述

当我运行下面的代码时,我得到以下输出

Matrikel: 01717
Process finished with exit code -1073741571 (0xC00000FD)

代码

char infos[255];
char matrikelnr[5];

sprintf(matrikelnr,"%d",s->matnr);
size_t n = strlen(matrikelnr);

while (n != 5) {
    memmove(matrikelnr + 1,matrikelnr,5);
    matrikelnr[0] = '0';
    n = strlen(matrikelnr);
}

printf("Matrikel: %s",matrikelnr);
strcpy(&infos[0],matrikelnr);
printf("DEBUG");

我已经尝试过: strcpy(infos[0],matrikelnr);strcpy(infos[0],matrikelnr);

strcpy 似乎有问题。你能帮我解决吗?

谢谢!

解决方法

您的代码的主要问题是您没有为字符串终止字符 '\0' 提供足够的空间。每个 C 字符串都需要它来标记字符串的结尾。如果需要存储5个字符的字符串,变量需要提供6个字符的空间。

但是,如果您使用标准格式设置工具,您的任务可以更简单地解决。像这样更改您对 sprintf() 的调用:

char matrikelnr[5 + 1];

sprintf(matrikelnr,"%05d",s->matnr);

'0' 用于使用零作为填充字符,'5' 用于(至少)5 个字符的宽度。

我希望您的数字永远不会大于 99999。

请阅读文档以了解详细信息,并考虑使用更安全的函数,例如 snprintf()

,

我认为,几乎不可能确切地告诉您给定代码出现问题的原因,但我可以根据我的经验给您一些建议。 c 中的某些函数(例如 memmove()、strcpy())没有完美的设计,因为它们的行为根据上下文是未定义的。因此,首先,确保在您的变量中正确设置了 NULL 字节(当涉及到 char* 时,这可能会导致 c 中的许多问题)。我认为您的 char 数组中的正确位置没有空字节,这会导致字符串函数出现问题(函数无法理解在将字符串从一个地方复制到另一个地方时何时停止)。附:当我说你知道的字符串时,我的意思是 char*。此类问题也经常导致“分段错误”。