【问题标题】:Putting text in scanf makes the code output random numbers?将文本放入 scanf 会使代码输出随机数?
【发布时间】: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 的其他文档。

标签: c scanf


【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2020-10-26
      • 1970-01-01
      • 2022-10-18
      • 2012-10-21
      • 2013-03-07
      相关资源
      最近更新 更多