在while循环中使用scanf的问题

时间:2015-09-28 03:33:19

标签: c arrays while-loop eof

我对编程很陌生。我正在做家庭作业,以帮助我们理解scanf和数组。该程序应该要求用户输入一组未知的数字。每组数字应该用下面的空格分隔,而不是输入。

14 15 16

用户也可以使用空格在单独的行上输入数字,但是在最后输入的数字上再次输入用户不应该输入。

12 13
44 55
5

用户应按ctrl-d指示输入结束。程序应显示用户输入的元素数量,并显示用户输入的数字。我一直在阅读并认为我有一个关于scanf如何工作的基本概念,但我仍然有一些困难。代码类型的工作。但是,如果用户只需在一行输入数字,则需要按三次ctrl-d才能退出循环并显示信息。
    从我在网上找到并理解,我认为它不起作用,因为用户没有命中返回,所以输入没有被刷新到标准输入。所以如果我理解正确的话,第一次点击ctrl-d时它会刷新输入。然后我第二次按下ctrl-d它最终将EOF放入流中,第三次它最终将读取EOF产生的-1并退出循环。 无论如何,一旦输入ctrl-d就强制输入流。

#include <stdio.h>
int main()
{
    int numbers[20];
    int i = 0, count, result, n;
    int flag = 0;

    printf("Please enter a seiries of numbers:\n");
    while (flag == 0)
    {
        result = scanf("%d", &n);  //scan user input into n variable along with getting scanf return value and storing in result variable
        printf("result =%i \n", result); //Just printing scanf return value to insure it doing what I think it should be doing
        if (result == 1) 
        {
            numbers[i] = n; //if scanf return value is 1 places value of n into first element of array
            i++;  //used to increment my array
            flag = 0;//keeps value of flag equal to 0 in order to stay in loop
        }

        if(result == -1) //checks to see if result = to -1 should be value returned if cntl +d is entered
        {
            flag = 1; //sets flag to 1 when cntrl +d is entered in order to exit loop.
        }
    }

    for (count = 0 ; count < i ; count++) //loop to print I which is representing number of user inputs and the actual numbers entered by the user.
    {
        printf("\ni= %i numbers= %i\n", i, numbers[count]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

我不会直接给你一个解决方案,但会尝试帮助你改进C中的编码。你使用C越多,你会发现一个人可以编写相当紧凑的代码,一旦语言是掌握。

您可以省略flag,因为它取决于result 您可以省略result,因为它只是scanf的返回值 您可以省略n并直接使用numbers数组 并且您可以使用预处理器来使用常数(通常用于您的情况下的数组大小)。

看看这个。也许它可以帮助你了解一下:

#include <stdio.h>

#define COUNT 20

main() {

    int numbers[COUNT];
    int i;

    i = 0;
    while (scanf("%d", &numbers[i]) == 1 && i < COUNT)
        printf("\t%d\n", numbers[i++]);
    return 0;
}

<强> P.S: 我建议您熟悉访问数组和阅读指针的不同方法。真的有非常亲密的关系。

数组中第一个元素的地址:numbers
访问数组的i元素:numbers[i]
同等地:*(numbers + i)
另一个等价:*(i+numbers)
惊喜,但又等同于:i[numbers]
数组的i元素的地址:&numbers[i]

K&amp; R是一个很好的信息和学习资源。