【问题标题】:scanf("%d", int) good yesterday, not today. What is going on?scanf("%d", int) 昨天好,今天不行。到底是怎么回事?
【发布时间】:2016-11-14 00:43:44
【问题描述】:

我对 C 的基础感到满意:-

此程序中有两次 scanf() 迭代。第一个功能齐全。 第二次出现什么都不做,而是退出程序并返回到标准命令提示符行。

另外,我的第二个 for 循环只打印前 4 个数字而不是 5 个。

代码如下:

int main() { 
    int i;
    int iNum[4]
    int iMenu = 0;

    printf("\n\n\tPlease enter five numbers: ");
    for (i = 0; i < 4; i++) {
        scanf("%d ", &iNum[i]);
    }
    printf("\n\tThank you. Here are your numbers: \n\t");

    for (i = 0; i < 4; i++) {
        printf("%d", iNum[i]);
    }
    printf("\n\tMenu:");
    printf("\n1\tSort your numbers ascending.");
    printf("\n2\tSort your numbers descending.");
    printf("\n3\tQuit program");
    printf("\n\nWhat would you like to do?\n\tEnter your option here: ");
    scanf(" %d", &iMenu);

    switch (iMenu) {
        case 1:
            printf("\nCase1testPrint");
            sortAsc();
            break;
        case 2:
            printf("\nCase2testPrint");
            sortDesc();
            break;

. . .//rest of code }

当程序到达第二个 scanf() 时,程序结束并返回到命令提示符。

这令人莫名其妙,我尝试了许多可能出错的变体。请提供您可以提供的。

这是我运行程序时的样子。注意我的条目“1”出现在命令行而不是程序中:

C:\Users\Cortland\Documents\C projects>gcc arraysort.c
C:\Users\Cortland\Documents\C projects>a

        Please enter five numbers: 3
6
5
4
5

        Thank you. Here are your numbers:
        3 6 5 4
        Menu:
1       Sort your numbers ascending.    
2       Sort your numbers descending.
3       Quit program

What would you like to do?
        Enter your option here:
C:\Users\Cortland\Documents\C projects>1

【问题讨论】:

  • 您的文本要求此人输入五个数字,但您的数组只有 4 的空间,而您的代码实际上只有 4 个数字。但是您的输出似乎显示它要求五个数字。此处不匹配。
  • for (i = 0; i &lt; 4; i++) { 将迭代 0、1、2、3。为什么不是 4?因为&lt; 不包括=
  • 那不是你的真实代码。 iNum 的声明中缺少分号。 (您还缺少#include &lt;stdio.h&gt;,但松散的编译器可能会让您在没有它的情况下进行编译。)除非您复制并粘贴出现问题的实际代码,否则我们无法区分实际代码中的错误和错误你在总结的时候介绍了。

标签: c


【解决方案1】:

您的for 循环读取四个数字,而不是五个。

您输入五个数字。前四个在for 循环中读取。第五个被读

scanf(" %d", &iMenu);

所以您输入了3 6 5 4 作为四个数字,然后输入了5 作为操作选项。您还没有向我们展示整个 switch 语句,但我的猜测是它不处理值 5,并且它会失败并且您的程序终止。

(另外,您应该经常检查scanf()返回的值,如果它表明输入操作失败,请采取一些措施。)

【讨论】:

    【解决方案2】:

    有几个错误。

    首先,你的 main() 函数的第二行包含一个语法错误 - 最后应该有一个分号。这应该会阻止您的程序甚至无法编译。

    其次,即使您说您希望用户输入 5 个数字,但您的数组和循环都使用数字 4。但是,您的程序仍然允许您输入 5 个数字的原因是因为您的编写方式调用 scanf() 中的格式化字符串。而不是:

    scanf("%d ", &iNum[i]);
    

    使用

    scanf("%d", &iNum[i]);
    

    注意到格式化字符串末尾缺少空格了吗?这就是你的问题所在。即使你被允许输入五个数字,程序也只存储和检查其中的四个。最后一个数字卡在输入流中 - 直到下一次调用 scanf()。这会获取您的最后一个数字,该数字通过 switch/case 语句放置(所有情况均失败,因为您没有输入“1”、“2”或“3”),并且程序到达 main() 的末尾并且退出。命令行中的“1”来自于在程序已经结束时尝试输入内容。

    总结:

    1:添加缺少的分号

    2:将 iNum 声明和 for 循环中使用的数字从 4 更改为 5

    3:编辑您的 scanf() 调用,从格式化字符串中删除空格。

    这解决了我的问题。

    【讨论】:

    • 感谢您的回复。 1. 这是一个转移错误——程序语法正确,编译没有问题。 2. 使用 4 而不是 5 是一个愚蠢的错误,认为 0 既算作第一个索引又算作第一个单位。错误的! 3. 空白让我失望。目的是干净的格式,但结果导致错误。我已经从 scanf 中删除了空格,并在下面添加了一个新的 printf,但仍在循环中,它添加了一个“”。谢谢winterweird。
    猜你喜欢
    • 2011-05-02
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多