【问题标题】:after getting an input from user in an array of maximum size 100, how to check how many values user has inputed? [duplicate]在从最大大小为 100 的数组中获取用户输入后,如何检查用户输入了多少值? [复制]
【发布时间】:2015-01-14 17:11:21
【问题描述】:

我对数组的最大大小(N)有限制,我想要求用户输入一个可以小于或等于N的数字数组。我如何找到用户有多少个值输入了吗?

这是我拥有的,但它不起作用。

(基本上,我是在告诉程序一旦用户按 Enter 键就停止计数“n”)(当然我初始化了 n=0)

for(i=0;i<(N-1);i++)
{

    scanf("%d",&a[i]);
    n++;

    if(a[i]=='/n'){break;}
}

感谢任何帮助!谢谢!

【问题讨论】:

  • 循环结束后i 的值将保持the number of values inputed - 1 所以你需要的是i+1 的值,一旦循环结束
  • 另外,说 它不起作用 并没有多大意义。 究竟是什么不起作用?正在发生的事情与您想要发生的事情?
  • 首先,对不起,我犯了一个错误,我写了 0 而不是 '/n'.. 代码本身可以工作,但是当我输入 5 个数字时,程序仍在等待让我输入更多并且不会结束程序。无论我输入多少个数字,我都希望它停止程序(只要它小于 N)
  • 您正在读取一个整数,然后检查用户是否输入了“10”(换行符的 ASCII 值),而不是他们是否实际按下了回车键......或者如果你使用过'\n' 而不是 '/n'。可能不是你想要的。
  • 如果我理解你的问题,你想用在一行中输入的整数填充你的数组,即直到一个换行符被 enountered 是这样吗?

标签: c arrays scanf


【解决方案1】:

这不起作用,因为带有 "%d" 说明符的 scanf 将跳过 \n,您可以使用所有空白字符并使用 fgetc() 搜索 '\n',最后一个空白字符不是'\n' 可以使用ungetc() 返回到流中,所以这个程序可能会满足你的需要

#include <stdio.h>
#include <ctype.h>

int main()
{
    int a[100];
    int i;
    int result;

    result = 1;
    i      = 0;
    while ((i < 100) && (result == 1))
    {
        int chr;

        /* 
         * consume all whitespace characters left by previous scanf, 
         * stop if one of them is '\n' 
         */
        while (isspace((chr = fgetc(stdin))) && (chr != '\n'));
        /* found the '\n', set the flag to exit the loop */
        if (chr == '\n')
            result = -1;
        else
        {
            /* not interesting put back this character for scanf to read it */
            ungetc(chr, stdin);
            /* save the result of scanf, that way you can validate input */
            result = scanf("%d", &a[i]);
            if (result == 1)
                i++;
        }
    }
    printf("read %d numbers\n", i);

    /* print the carachters, this will print in reverse obviously */
    while (--i >= 0)
        printf("%d\n", a[i]);


    return 0;
}

【讨论】:

  • @chux 谢谢,完成。我仍在尝试了解 scanf 的工作原理,这并不是我最喜欢的功能。
【解决方案2】:
#include <stdio.h>
#include <ctype.h>

#define N 100

int main(void){
    int v, a[N];
    int i, n=0, stop = 0;
    int ch, res;

    while(!stop && EOF != (res = scanf("%d", &v))){
        if(res == 1){
            a[n++] = v;
            if(n == N)
                break;
            while(isspace(ch = getchar())){
                if(ch == '\n'){
                    stop = 1;
                    break;
                }
            }
            ungetc(ch, stdin);
        } else {
            printf("invalid input!\n");
            while(getchar() != '\n');
        }
    }
    for(i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

【讨论】:

  • 极端情况:当 0 个号码在线时失败。
  • 元素在零的情况下不显示。换行符是输出。
  • scanf("%d", &amp;v) 使用 '\n' 然后 while 循环不会停止,直到 下一个 '\n'
  • 但我认为OP想要的这些东西是否不清楚。
【解决方案3】:

您可以要求用户输入他愿意输入的项目数。假设最大数量为N,用户想要的项目数量为n

puts("ENTER NUMBER OF ITEMS");
scanf("%d", &n);

n = min(n, N);
n = max(n, 0);

for(int i = 0; i < n; i++)
{   scanf("%d", &a[i]);
}

如果用户一直输入数字,然后按回车键停止,您可以逐行读取输入并检查用户是否输入了某些内容或退出循环。

int i = 0;
for(; i < N; i++)
{   char s[100];
    gets(s);

    if(strcmp(s, "") == 0) break;
    a[i] = atoi(s);
}

读取的项目数等于i。这不太安全,如果您愿意使用此解决方案,则必须进行一些错误检查。

【讨论】:

  • 是的,我知道我们可以这样做,但遗憾的是,任务不允许这样做:(
  • 谁投了反对票,写评论解释原因..
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2016-05-24
  • 2020-11-02
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多