【问题标题】:Why is my program printing the last input line twice?为什么我的程序两次打印最后一个输入行?
【发布时间】:2019-09-11 02:48:51
【问题描述】:

我的程序应该打印我输入的内容 带有scanf的字母并在打印后将它们保存在变量中 什么是 在他们里面。这是一个循环,因此它可以打印每一行。不过好像 要么扫描最后一行两次,要么打印两次

我尝试将 \n 放在解决打印问题的扫描中,但是 现在它不会打印每行的第一个字母

#include <math.h>
#include <stdio.h>

int main()
{
    double tempG = 0;
    double altG = 0;
    double humG = 0;

    char cultivo[100] = " ";

    char  nombre[100] = " ";
    double temp = 0;
    double alt = 0;
    double hum = 0;

    char insertado;
    
    int contador = 0;
    scanf("%lf %lf %lf" , &tempG, &altG, & humG);
    printf("%2.0lf %2.0lf %2.0lf \n \n", tempG, altG, humG);
    char temporal[100] = "";
    while(scanf("%c", &insertado) != EOF){
            scanf("%s %lf %lf %lf", nombre, &temp, &alt, &hum);
            printf("%s %.0lf %.0lf %.0lf \n", nombre, temp, alt, hum);
    }
    
    return 0;
}

这是我的输入和我的预期输出:

25 65 1200

Banano 27 50 1000
Brocoli 16 75 2500
Fresas 18 80 2000
Zanahoria 21 75 1200
Tomate 22 75 1000

这是我的实际输出:

25 65 1200

Banano 27 50 1000
Brocoli 16 75 2500
Fresas 18 80 2000
Zanahoria 21 75 1200
Tomate 22 75 1000
Tomate 22 75 1000

【问题讨论】:

  • 我做了,但它仍然无法工作,仍然打印两次
  • 如果我在最后一个 %lf 之后的 scanf 中放了一个空格,它会停止打印最后一个两次,但它会停止打印每个字母的第一个字母
  • 在尝试使用它设置的值之前,您应该始终检查每个 scanf() 调用的返回值是否成功。
  • C 语言中的一种新东西,所以我不确定你的意思,但我实际上打印了它们,看看它是否按照它应该的方式扫描所有内容,但它似乎没有这样做
  • 使用fgets() 或POSIX getline() 读取行,然后使用sscanf() 解析数据。它通常效果更好——尤其是对你更有效。

标签: c printf scanf


【解决方案1】:
  • scanf 正在将值读取到每次运行前未清除的变量中。
  • 您没有检查scanf 的返回值以确保它成功。
  • scanf 不会读取输入末尾的换行符,但 scanf('%c') 会。

这意味着在您读取最后一行输入后,您循环返回,while(scanf(…)) 成功读取最后一个换行符,您的另一个 scanf 失败,因为没有更多输入,printf 打印陈旧数据在局部变量中。

【讨论】:

  • 嗯,好吧,所以我明白它会再做一次,但是我能做些什么来阻止它这样做呢?
  • 在尝试使用它应该写入的任何变量之前,请始终检查scanf 的返回值。在scanf 行之后,您可以使用getc() 抓取下一个字符,如果是换行符则将其丢弃,如果不是,则将其放回ungetc()。然后,您的 while 条件将检查 EOF 而不是尝试读取任何内容。
  • 好吧,虽然我也尝试放置而不是 ==1 我放了 != EOF 但它也没有工作。但是我现在尝试使用这个 getc() 并让你知道它是否有效
  • ok 我试过 if getc(stdin) == '\n' throw away else ungetc(stdin);但是这个unget不起作用
  • 当您调用ungetc() 时,您还必须将要放回的字符传递给它。有关使用详情,请参阅 the ungetc 文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多