我想从用户那里获取数组元素,而一开始不知道它的数组大小。我使用了 scanf 逻辑。但是我无法打印值

I want to get the array elements from the user without knowing it's array size at first. I used scanf logic.But I ain't able to print value

提问人:JAISHREEDEVAKI T 提问时间:10/20/2023 最后编辑:JAISHREEDEVAKI T 更新时间:10/21/2023 访问量:79

问:

#include <stdio.h>

int main() {
    int arr[1000], i, n = 0;
    while (89) {
        if (scanf("%d", &i) == -1)
            break;
        arr[n] = i;
        n++;
    }
    for (int j = 0; j < n; j++)
        printf("%d", arr[j]);
    return 0;
}

我试图在运行时获取数组元素,而不知道它的数组大小。所以我使用 scanf.scanf 如果没有什么可以扫描的,将返回 -1 。我不知道我的逻辑中有什么错误。此代码不打印任何内容。

c

评论

1赞 Jabberwocky 10/20/2023
你如何告诉你的程序“没有什么可扫描的”?
1赞 Barmar 10/20/2023
用户需要键入 EOF 字符(Unix 上的 Ctl-d,Windows 上的 Ctl-z),以指示输入的结束。
4赞 Barmar 10/20/2023
while(89)--为什么?查看 stackoverflow.com/questions/1921539/using-boolean-values-in-c89
0赞 chux - Reinstate Monica 10/21/2023
@JAISHREEDEVAKI T,输入是在一行还是多行上?什么表示输入结束、换行、文件结束或两者兼而有之?
0赞 Simon Goater 10/21/2023
这可能是练习实现链表的好机会。

答:

-2赞 Nierusek 10/20/2023 #1

您的代码是正确的。 当没有可读取的内容 (EOF) 时,返回 -1。在以下情况下,您可以看到您的代码有效:scanf

  • 输入数字,然后在 Linux 上按 CTRL+D,或在 Windows 上按 CTRL+Z。
  • 将文件重定向到您的程序。在 Linux 上,您可以执行 ../myprogram < input file

我还想补充一点,可以代替.while(89)while(scanf("%d", &i) != -1)

3赞 chqrlie 10/21/2023 #2

代码中存在多个问题:

  • 如果用户输入的数字超过 1000 个,则会将下一个数字存储在数组末尾之外,从而导致未定义的行为。如果程序不需要处理任意数量的条目,则可以使用固定大小的数组,但应测试索引以避免在意外长的输入上出现未定义的行为。如果程序需要处理任意大量的数字,则必须在读取更多数字时分配和重新分配数组,使用 和 。malloc()realloc()

  • while (89)是一个无限循环,就像......一种更惯用的方式来编写这样一个没有幻数的循环,例如 iswhile (1)89for (;;)

  • if (scanf("%d", &i) == -1)不是检查用户输入的可靠方法:如果他们键入任何无法解析为整数的内容,将返回 ,导致循环不断迭代,将不确定的值存储到数组中,直到达到该值,并且上面描述的未定义行为将导致程序失败。scanf0n1000

  • printf("%d", arr[j]);不分隔输出流中的数字。这可能是有意为之,但如果不是,则应输出分隔符,例如空格或换行符。

下面是代码的修改版本,其限制相同,为 1000 个值:

#include <stdio.h>

int main(void) {
    int arr[1000], val, n;
    for (n = 0; n < 1000 && scanf("%d", &val) == 1; n++)
        arr[n] = val;
    }
    for (int i = 0; i < n; i++) {
        printf("%d\n", arr[i]);
    }
    return 0;
}

下面是一个可以处理任意数量的替代方法,仅受可用内存的限制:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *arr = NULL, val;
    size_t allocated = 0, n = 0;
    while (scanf("%d", &val) == 1) {
        if (n == allocated) {
            size_t new_allocated = allocated + allocated / 2 + 32;
            int *new_arr = realloc(arr, sizeof(*arr) * new_allocated);
            if (new_arr == NULL) {
                fprintf(stderr, "cannot allocate space for %zu entries\n", new_allocated);
                free(arr);
                return 1;
            }
            arr = new_arr;
            allocated = new_allocated;
        }
        arr[n++] = val;
    }
    for (size_t i = 0; i < n; i++) {
        printf("%d\n", arr[i]);
    }
    free(arr);
    return 0;
}