【问题标题】:Why does my program print the same statement twice? [duplicate]为什么我的程序两次打印相同的语句? [复制]
【发布时间】:2018-01-07 15:29:26
【问题描述】:

我正在创建一个简单的应用程序来跟踪我的工作时间。用户输入他们正在做的工作的分钟数,程序将跟踪总数,直到终止。问题是在程序第一次运行之后,它会两次打印出它的第一条语句。我把它放在一个无限循环中,我对 scanf 和 printf 没有很好的掌握,所以我认为这就是我失败的地方。任何帮助将不胜感激。

这是程序的样子:

#include <stdlib.h>
#include <stdio.h>

void logic(int *minutesWorked, int *hoursWorked, int *totalMinutesWorked);

int main(void)
{
    int     minutesWorked = 0;
    int     hoursWorked = 0;
    char    letter = 0;
    int     totalMinutesWorked = 0;

    while (1) {
        printf("Enter I for input or T for total\n");
        scanf("%c", &letter);
        if (letter == 'i' || letter == 'I') {
            printf("Please enter minutes worked\n");
            scanf("%d", &minutesWorked);
            logic(&minutesWorked, &hoursWorked, &totalMinutesWorked);
        }
        else if (letter == 't' || letter == 'T') {
            printf("Hours worked is %d and minutes worked is %d\n", hoursWorked,totalMinutesWorked);
        }
    }
    return EXIT_SUCCESS;
}       /* ----------  end of function main  ---------- */


void    logic(int *minutesWorked, int *hoursWorked, int *totalMinutesWorked)
{
    *totalMinutesWorked += *minutesWorked;
    if (*totalMinutesWorked >= 60) {
        *hoursWorked += *totalMinutesWorked / 60;
        *totalMinutesWorked = *totalMinutesWorked % 60;
    }
}       /* -----  end of function logic  ----- */

这是它显示的示例:

Enter I for input or T for total
I
Please enter minutes worked
100
Enter I for input or T for total
Enter I for input or T for total
I
Please enter minutes worked
33
Enter I for input or T for total
Enter I for input or T for total
T
Hours worked is 2 and minutes worked is 13
Enter I for input or T for total
Enter I for input or T for total

【问题讨论】:

  • 我猜——虽然我不能肯定——你正在读取数字后面的换行符,发现它既不是 I 也不是 T,然后转到循环的顶部。
  • 将输入视为字符串,在scanf 函数上绑定一个有点正则表达式的表达式,即[^\n],然后将字符串解析为整数。
  • 请注意,变量 minutesWorkedhoursWorkedtotalMinutesWorked 对是分开的。如果你使用更系统的名字,你会让周围的生活更轻松。可能,使用totalHoursWorked 匹配totalMinutesWorked。名字对人类很重要。编译器并不担心。

标签: c printf scanf stdio


【解决方案1】:

最好的解决方案是使用 fgets() 而不是 scanf(),但如果这不是一个选项,您可以添加此行以在每次 scanf 调用后清除输入缓冲区:

fseek(stdin, 0, SEEK_END);

【讨论】:

  • 据我了解,C 中不能保证stdin 应该支持定位请求,这意味着这里对fseek() 的调用可能会失败;这不是便携式的。有更好的方法可以便携式清除输入流,例如惯用的int c; while ((c = getchar()) != '\n' &amp;&amp; c != EOF);
  • @DavidBowling 同意
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 2019-06-20
  • 2021-12-25
  • 1970-01-01
  • 2021-03-25
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多