从scanf函数接受任意数量的输入

我试图使用scanf函数读取未知数量的输入。

 int a[100]; int i = 0; while((scanf("%d", &a[i])) != '\n') i++; // Next part of the code 

但是这个函数不会进入下一部分代码,似乎有一个无限的while循环。

我该如何解决这个逻辑错误? 是否还有像sscanf scanf一样的其他替代方法可以将整数读入数组?

scanf返回已成功匹配和分配的输入项的数量,因此可以这样做:

 while(scanf(...) == 1) 

现在,您希望能够读取多个数字,每个数字都在新行上定义。 然后你可以简单地这样做:

 int array[100]; int i = 0; while(i < 100 && scanf("%d\n", &array[i]) == 1) i++; 

请注意,只有输入无效输入(例如字母q )或输入输入结束控制代码(即Ctrl + Z (在Windows上)或Ctrl + D (在Mac,Linux上, Unix的)。

scanf的返回值是成功匹配和分配的输入项数量 ,因此尝试在遇到非数字输入时结束:

 while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; } 

首先将"%d"替换为"%d" ,这将避免新的线路问题

第二,如果你的输入包含非数字输入,那么你的while循环将进入无限循环。 所以你必须检查你的输入是否是数字输入

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以转发适当数量的字符。

你想做

 char discard; while(i < 100 && (scanf("%d%1[^\n]s", &arr[i], &discard)) == 2) i++; 

继续输入直到换行。

scanf()不是读取整行的最佳工具。 您应该使用fgets()来读取该行,然后使用sscanf()或其他函数对其进行解析。