我正在尝试使用scanf
函数读取未知数量的输入。
int a[100];
int i = 0;
while((scanf("%d", &a[i])) != '\n')
i++;
// Next part of the code
但是这个函数不会进入下一部分代码,似乎有一个无限的while循环。
如何解决此逻辑错误? scanf
之类的sscanf
是否有其他替代方法可以将整数读入数组?
答案 0 :(得分:8)
scanf
返回已成功匹配和分配的输入项的数量,因此这样做是合理的:
while(scanf(...) == 1)
现在,您希望能够读取多个数字,每个数字都在新行上定义。然后你可以这样做:
int array[100];
int i = 0;
while(i < 100 && scanf("%d\n", &array[i]) == 1)
i++;
请注意,只有输入无效输入(例如字母q
)或输入输入结束控制代码( Ctrl + <)时,此读数才会停止kbd> Z (在Windows上)或 Ctrl + D (在Mac,Linux,Unix上)。
答案 1 :(得分:2)
scanf的返回值是成功匹配并分配的输入项数,因此请在遇到非数字输入时尝试此操作:
while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; }
答案 2 :(得分:0)
你想做
char discard;
while(i < 100 && (scanf("%d%1[^\n]s", &arr[i], &discard)) == 2)
i++;
继续输入直到换行。
scanf()不是阅读整行的最佳工具。您应该使用fgets()来读取该行,然后使用sscanf()或其他函数对其进行解析。
答案 3 :(得分:0)
scanf的返回值是每次调用的扫描输入数。您可以将它与整数10(或'\ n')进行比较,这将在scanf实际读取10个项目时停止循环。 (要做到这一点,它必须在格式字符串中有十个说明符。
你可以尝试
while((i<10) && (scanf("%d",a+i)==1)) i++;
必须编程接受任意数量的参数,例如。如
while (fgets(mybuf, ALLOCATED_LENGTH-1, stdin)) {
char *p = mybuf;
if (*p=='\n') break; // or a better function to test for empty line
while (custom_scan_next_integer(&p)) i++;
}
其中custom_scan_next_integer
修改指针p以转发适当数量的字符。
答案 4 :(得分:0)
首先将"%d"
替换为" %d"
,这样可以避免新行问题
第二,如果你的输入包含非数字输入,那么你的while循环将进入无限循环。所以你必须检查输入是否为数字输入
答案 5 :(得分:0)
我认为主要问题是您不知道应该从输入中读取多少个数字 我从其他地方找到了这个答案,这不是我的,但这是一个很好的技巧
#include <stdio.h>
#include <stdlib.h>
int main() {
int i=0, j=0;
int arr[10000];
char temp;
do {
scanf("%d%c", &arr[i], &temp);
i++;
} while(temp != '\n');
for(j=0; j<i; j++) {
printf("%d ", arr[j]);
}
return 0;
}
此代码属于Abhishek Bhattacharya (from Quora)(第一个答案)