将文本放入 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 无法读取这些数字。 xy 未修改。它们是尚未初始化的自动变量。因此它们包含垃圾。 查看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】:

您需要使用printfscanf

#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 会使代码输出随机数?的主要内容,如果未能解决你的问题,请参考以下文章

对于scanf和cin的输入输出速度的验证

Python:将随机数放入列表中

连接Google脚本中的文本和随机数

java,随机生成20随机整数

求一串完整的php代码+html php随机生成10位数字,而且永远不会重复,在一个单行文本框内输出

放入块中或使用views_get_view时,随机缓存视图的顺序不同