繁体   English   中英

在while循环中使用scanf的问题

[英]Issues with using scanf inside a while loop

我是编程的新手。 我正在从事一项家庭作业,以帮助我们理解scanf和数组。 该程序应该要求用户输入一组未知的数字。 每组数字之间应使用空格隔开,如下所示,请不要按回车键。

14 15 16

用户也可以在单独的行上输入数字,而不是使用空格,但是在输入的最后一个数字上,用户也不应按回车键。

12 13
44 55
5

用户应按ctrl-d指示输入结束。 该程序应显示用户输入的元素数量以及显示用户输入的数量。 我一直在阅读,认为我对scanf的工作原理有一个基本概念,但是我仍然遇到一些困难。 该代码的作品。 但是,如果用户仅在一行上输入数字,则需要按ctrl-d 3次才能退出循环并显示信息。
根据我在网上找到并了解的信息,我认为它不起作用是因为用户没有按回车键,因此输入尚未刷新到标准输入中。 因此,如果我理解正确,那么在刷新输入时第一次按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;
}

我不会直接给您提供解决方案,而是会尝试帮助您改善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;
}

PS:我建议您熟悉访问数组和阅读指针的不同方法。 确实有非常密切的关系。

数组中第一个元素的地址: numbers
访问数组的第i个元素: numbers[i]
等效: *(numbers + i)
另一个等效项: *(i+numbers)
令人惊讶,但又相等: i[numbers]
i个数组元素的地址: &numbers[i]

K&R是大量的信息和学习资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM