是的,所以我想通过做一个基于文本的小型 RPG 游戏来学习 C 语言。我按照我在 Java 中类似地做游戏的步骤进行操作,但使用了一些不同的解决方法,直到我得到输出的问题,即第一个字符串被我输入的第二个字符串部分覆盖。这是问题发生的地方(我想)。
struct character{
char firstname[100];
char lastname[100];
};
int main(){
struct character charname;
char first=charname.firstname[100];
char last=charname.lastname[100];
printf("And what do they call you?(First name)\n");
scanf("%s", &first);
printf("Any other names?(Last name)\n");
scanf("%s", &last);
printf("So you are called ");
printf("%s ", &first);
printf("%s ", &last);
return 0;
}
我得到的输出是:
And what do they call you?(First name) Bob
Any other names?(Last name) Dole
So you are called BDole Dole
我不是 BDole Dole 而是 Bob Dole!!!
有什么想法吗?
(刚刚意识到这里的代码输入有多可怕)
最佳答案
当你做的时候
char first=charname.firstname[100];
您从包含 100 个字符的数组中得到字符 101(记住数组索引是从零开始的)。这本身就是未定义的行为。
然后,您通过使用 &first
获取一个不进入数组的指针,甚至不超出数组,而是指向局部变量 first
所在位置的指针,使情况变得更糟内存,将字符串写入此位置会覆盖堆栈上的内存,并导致非常严重的问题。
您可能想要的是例如
char *first=charname.firstname;
但这甚至都不需要,因为数组自然会衰减到指向其第一个元素的指针,这意味着这是完全有效的:
scanf("%99s", charname.firstname);
注意 "%99s"
格式,它告诉 scanf
不要读取超过 99 个字符,因此它不会写入超出结尾的部分提供缓冲区。
关于C字符串不断相互覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933611/