将文本放入 scanf 会使代码输出随机数?
Posted
技术标签:
【中文标题】将文本放入 scanf 会使代码输出随机数?【英文标题】:Putting text in scanf makes the code output random numbers? 【发布时间】:2019-11-18 15:14:15 【问题描述】:我在我的计算机课上学习 C,今天我们被介绍给 scanf。这是用于引入scanf的代码行:
#include <stdio.h>
void main()
float x,y;
scanf("%f %f",&x,&y);
printf("%2f\n",x+y);
这很好用,如果你输入两个数字,它会打印总和。 我认为它可能像 pythons 输入函数一样工作,所以我修改了上面的代码,在 scanf 中包含一些文本,如下所示:
#include <stdio.h>
void main()
float x,y;
scanf("insert no in format x y %f %f",&x,&y);
printf("%2f\n",x+y);
我得到的输出不是 10,而是一些随机数。我说随机,因为我尝试多次运行代码,每次收到不同的输出。
这与内存分配有关吗? scanf 可以不是字符串吗?
【问题讨论】:
scanf
无法读取这些数字。 x
和 y
未修改。它们是尚未初始化的自动变量。因此它们包含垃圾。
查看scanf
的返回值。如果读取了两个数字,则应该是 2。
你能做到吗?或者你必须在scanf之前用“insert no in format...”调用printf?
"我认为它可能像 pythons 输入函数一样工作" --> 一个好的猜测,但是因为它没有工作,所以节省了我们所有的时间。阅读Linux man page 的其他文档。
【参考方案1】:
scanf
用于读取输入,而不是打印输出。如果您将文本放在那里,它会尝试匹配该文本。如果它与该文本不匹配(您必须输入该确切文本),则该函数将失败,并且如果您稍后尝试使用这些值,则它是未定义的行为。见here(强调我的):
非空白字符,格式说明符 (%) 除外:任何字符 这既不是空白字符(空白、换行符或制表符),也不是 格式说明符的一部分(以 % 字符开头)导致 函数从流中读取下一个字符,将其与 此非空白字符,如果匹配,则将其丢弃并 该函数继续使用格式的下一个字符。 如果 字符不匹配,函数失败,返回离开 流的后续字符未读。
您可以通过检查返回值来确保它成功读取了这些值:
成功时,函数返回参数的项目数 列表已成功填写。这个计数可以匹配预期的数量 由于匹配失败,项目或更少(甚至为零),读数 错误,或到达文件末尾。
所以在这种情况下,你的返回值应该是2
。
如果您想打印该文本,您可以改用printf
:
printf("insert no in format x y");
if (scanf("%f %f",&x,&y) != 2)
printf("Error reading in the parameters!");
return -1;
;
【讨论】:
【参考方案2】:您需要使用printf
和scanf
。
#include <stdio.h>
void main()
float x,y;
printf("insert no in format x y");
scanf("%f %f",&x,&y);
printf("%2f\n",x+y);
【讨论】:
以上是关于将文本放入 scanf 会使代码输出随机数?的主要内容,如果未能解决你的问题,请参考以下文章