问题描述
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);
谢谢!
解决方法
您的代码的主要问题是您没有为字符串终止字符 '\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*。此类问题也经常导致“分段错误”。