提问人:JAISHREEDEVAKI T 提问时间:10/20/2023 最后编辑:JAISHREEDEVAKI T 更新时间:10/21/2023 访问量:79
我想从用户那里获取数组元素,而一开始不知道它的数组大小。我使用了 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
问:
#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 。我不知道我的逻辑中有什么错误。此代码不打印任何内容。
答:
您的代码是正确的。 当没有可读取的内容 (EOF) 时,返回 -1。在以下情况下,您可以看到您的代码有效:scanf
- 输入数字,然后在 Linux 上按 CTRL+D,或在 Windows 上按 CTRL+Z。
- 将文件重定向到您的程序。在 Linux 上,您可以执行 .
./myprogram < input file
我还想补充一点,可以代替.while(89)
while(scanf("%d", &i) != -1)
代码中存在多个问题:
如果用户输入的数字超过 1000 个,则会将下一个数字存储在数组末尾之外,从而导致未定义的行为。如果程序不需要处理任意数量的条目,则可以使用固定大小的数组,但应测试索引以避免在意外长的输入上出现未定义的行为。如果程序需要处理任意大量的数字,则必须在读取更多数字时分配和重新分配数组,使用 和 。
malloc()
realloc()
while (89)
是一个无限循环,就像......一种更惯用的方式来编写这样一个没有幻数的循环,例如 iswhile (1)
89
for (;;)
if (scanf("%d", &i) == -1)
不是检查用户输入的可靠方法:如果他们键入任何无法解析为整数的内容,将返回 ,导致循环不断迭代,将不确定的值存储到数组中,直到达到该值,并且上面描述的未定义行为将导致程序失败。scanf
0
n
1000
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;
}
评论
while(89)
--为什么?查看 stackoverflow.com/questions/1921539/using-boolean-values-in-c89