【问题标题】:Accepting any number of inputs from scanf function接受来自 scanf 函数的任意数量的输入
【发布时间】:2013-02-23 20:26:15
【问题描述】:

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

int a[100];
int i = 0;

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

// Next part of the code

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

如何解决这个逻辑错误? scanf 是否有其他替代方法,例如 sscanf 将整数读入数组?

【问题讨论】:

  • 你想如何标记输入的结束?
  • 假设用户开始输入一个数字列表,比如 10 空格 20 空格 30 并且在他们完成输入后他们应该按下回车键退出循环
  • scanf 的返回值是成功匹配并分配的输入项数,可以小于提供的值,如果早期匹配失败,甚至可以为零。所以与\\n的比较是不正确的。
  • 因为getchar 从标准输入返回下一个字符,而不是scanf
  • n = scanf("%d%d ... %d", a+0, a+1, ..., a+99); printf("%d numbers\n", n);

标签: c while-loop scanf


【解决方案1】:

你想做的

char discard;

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

不断获得输入直到换行。

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

【讨论】:

  • 这行得通吗?我希望所有数字之间都有空格。
【解决方案2】:

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

【讨论】:

  • 这可行,但缺少将未知数量的输入读取到数组中的全部意义。魔术数字10不好。关键是我不知道用户在按下回车键之前会输入多少个数字
【解决方案3】:

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

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

【讨论】:

  • @user2147954:因为读取会一直持续到输入无效输入或 EOF。看我的回答。
【解决方案4】:

首先将"%d"替换为" %d",这样可以避免新行问题

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

【讨论】:

    【解决方案5】:

    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() 格式字符串中的尾随 \n 是用户界面灾难。第一个数字的输入不会结束,直到您键入不是空格的内容(可能是第二个数字)。此外,格式字符串中的换行符匹配任何空格——空格或制表符以及换行符;它强调不需要换行符。而且,暂时的最后钉子,像%d这样的数字转换规范会自动跳过(领先)空白。只有%c%[…](扫描集)和%n不跳过空格。
    • 建议:从格式字符串中删除\n。当人类打字时,代码会更好地工作。 (对于用户而言,由于输入的数字之间没有反馈,因此存在问题不会很明显。所以你在这个例子中逃脱了。在其他情况下,会有问题需要用户有先见之明——知道要做什么输入下一个。)
    【解决方案6】:

    我认为主要问题是您不知道应该从输入中读取多少数字 我从其他地方找到了这个答案,这不是我的,但这是一个很棒的技巧

    #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)(第一个答案)

    【讨论】:

    • 请链接到您获得代码的 Quora 页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2016-08-22
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多