sscanf()改变了其他变量

时间:2018-01-29 02:31:50

标签: c scanf

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

ToDoList53172://easyauth.callback

1 个答案:

答案 0 :(得分: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更合适。