我有另一个函数read_line(),这里没有显示;它只是打印出一个字符串消息并读取用户输入的输入。以下是我的主要功能。我在这里有两个printf()函数,它们打印出不同的结果,而我认为x将保持其值。这是否意味着sccanf()与更改x的值有关?例如,我键入250,printf()结果为250和7565921.
ToDoList53172://easyauth.callback
答案 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
是
已经是一个字符串对于其他功能,例如strchr
或strtok
更合适。