gpt4 book ai didi

c - sscanf() 更改其他变量

转载 作者:行者123 更新时间:2023-11-30 20:32:06 24 4
gpt4 key购买 nike

我还有另一个函数read_line(),这里没有显示;它只是打印出一条字符串消息并读取用户输入的输入。以下是我的主要功能。我这里有两个 printf() 函数,它们打印出不同的结果,而我认为 x 将保持其值。这是否意味着 sccanf() 与更改 x 的值有关?例如,我输入 250,printf() 结果是 250 和 7565921。

 int main(){
char buffer[100];
int x;
char y;

read_line("x: ", buffer,sizeof(buffer));
sscanf(buffer, "%d", &x);
while(1){
read_line("y: ", buffer,sizeof(buffer));
printf("%d\n", x);
sscanf(buffer, "%s", &y);
printf("%d\n", x);
}
return 0;
}

最佳答案

这行是错误的

sscanf(buffer, "%s", &x);

您正在读取一个字符串,并且 sscanf 写入 &x 指向的内存中,但 x 是一个整数,而不是 char 数组。这意味着取决于输入的长度,您会溢出内存,因为它会写入更多字节比 int 所能容纳的更多。这是未定义的行为,这就是为什么你会看到垃圾。您可能想做

sscanf(buffer, "%d", &x);

在第二个sscanf中。

是的,如果您将 &x 传递给 sscanf 的后续调用,则后续调用显然会改变x的值。

更新

现在您已经更新了代码

sscanf(buffer, "%s", &y);

这也是错误的。您正在传递一个指向 char 的指针,但它可以容纳 1仅字节。 1 个字符长的字符串至少需要 2 个字节,因为在 C 中字符串以 '\0' 结尾。字符串只是一个字符序列以'\0'结束字节。

因此,在这种情况下,sscanf 也会溢出内存,这又是一次未定义的行为,所以任何事情都有可能发生。 x 发生了变化,因为溢出。

您必须将代码更改为:

char y[20];
sscanf(buf, "%s", y);

假设字符串不超过 19 个字符,这将起作用。

char y[20];
sscanf(buf, "%19s", y);

这将确保您写入的字符数不超过 20 个。读书时未知长度的字符串,特别是如果它们包含空格,sscanf可能不是最好的选择,我的意思是buf是已经是一个字符串了。对于其他函数,例如 strchrstrtok 更合适。

关于c - sscanf() 更改其他变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com