C字符串不断相互覆盖

标签 c string merge overwrite

是的,所以我想通过做一个基于文本的小型 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/

相关文章:

c++ - 优化整数和浮点乘法

java - 字符串子串索引可以是字符串的长度

python - 根据两列的比较从第二个 DataFrame 添加列

c - 为什么将指向字符串值的指针更改为另一个字符串可以工作,但不能直接更改字符串的值?

c - 如何使用 openSSL api 将公钥转换为字符串?

c - 使用二元运算计算 n 个 1

java - 将大字符串数组(base64 图像)发送到休息服务给出错误(使用 tomcat7)

string - 严格将字符串转换为 int

xml - 在 xml/xslt 中分组/合并相同节点的子节点

python - 用于合并和展平树结构的集合合并