【问题标题】:Beginner problem with printf and scanf in CC中printf和scanf的初学者问题
【发布时间】:2020-03-28 22:39:08
【问题描述】:

我在如下代码的 sn-p 中遇到了 scanf()printf() 函数的问题:

#include <stdio.h>

int main() {
    int a;
    int b;
    int c;
    scanf("%d %d", &a, &b);
    while (c >= 2) {
        c = a % b;
        a = b;
        b = c;
        printf ("%d\n", c);
    }
    return 0;
}

我期望发生的事情,并且发生在我兄弟的 Code::Block 中,是让程序等待来自stdin 的输入,然后将结果打印到stdout,每行一个,直到达到最高公约数。

但是,当我输入vi,然后用gcc 编译它并从我的终端运行程序时,程序正确地接受输入但退出而不返回任何东西给stdout

如果我注释掉 scanf() 行并将任何数字硬编码到 ab 变量,一切都会按预期工作。

我正在尝试学习 C 并且我已经阅读了有关函数的基本文档,但我无法帮助理解这种行为。 我尝试在声明变量之前添加setbuf(stdout, NULL),但没有任何改变。

谁能给我一个线索?

【问题讨论】:

  • c 被统一化
  • 编译器或操作系统实际上使c 为零。如果不是,那么当你执行它时,它可能会在标准输出上打印一些东西。本质上,这是未定义的行为。

标签: c printf scanf


【解决方案1】:

您的scanfprintf 调用没有任何问题,但正如其他人所提到的,一个明显 问题是您正在测试未初始化变量的值 (c)。

也许,你想要的是一个do { ... } while (...); 循环,而不是一个简单的while 循环。

以下代码将保证执行循环至少一次,然后在每个循环的结束检查是否重复一遍:

#include <stdio.h>
int main() {
    int a;
    int b;
    int c;
    scanf ("%d %d", &a, &b);
    do {
        c = a % b;
        a = b;
        b = c;
        printf ("%d\n", c);
    } while (c >= 2);
    return 0;
}

(或者,使用 &gt;= 2 的值初始化 c,即使用声明:int c = 3;。)

有关do .. while 循环的进一步讨论,请参见此处:'do...while' vs. 'while'

【讨论】:

  • scanf() 有问题,虽然不是问题的原因。 OP 应检查返回值以检测无效输入并避免在未正确读取 ab 时继续。
  • @chqrlieforyellowblockquotes 我不能/不会对此提出异议! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多