5

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

int a[100];
int i = 0;

while((scanf("%d", &a[i])) != '\n')
 i++;

// Next part of the code

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

如何解决这个逻辑错误?有没有其他选择scanf喜欢sscanf将整数读入数组?

4

6 回答 6

8

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

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

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

int array[100];
int i = 0;

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

请注意,仅当输入无效输入(例如 letter q)或输入输入结束控制代码时,此读取才会停止,即Ctrl+ Z(在 Windows 上)或Ctrl+ D(在 Mac、Linux、Unix 上)。

于 2013-03-08T10:26:39.813 回答
2

scanf 的返回值是成功匹配和分配的输入项的数量,所以当遇到非数字输入时尝试这样结束:

while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; }
于 2013-03-08T10:20:41.640 回答
0

你想做

char discard;

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

不断获得输入直到换行。

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

于 2013-03-08T10:20:02.430 回答
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++;
   }

wherecustom_scan_next_integer修改指针 p 以转发适当数量的字符。

于 2013-03-08T10:20:25.693 回答
0

首先用这个替换"%d"" %d"避免新行问题

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

于 2013-03-08T10:20:58.027 回答
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(来自 Quora)(第一个答案)

于 2021-02-26T14:00:15.797 回答