【问题标题】:fgets() and sscanf() only stores first integer in array [closed]fgets() 和 sscanf() 仅将第一个整数存储在数组中[关闭]
【发布时间】:2019-09-27 07:11:06
【问题描述】:

我试图使用 Enter 键终止整数数组输入。所以,我想过使用 fgets 和 sscanf() 但每次我只获得第一个值时,我都尝试了几种方法。有人可以在我做错的地方提供帮助。

#include<stdio.h>
int main(){
int inp[100]={0};

int c=0,n;
char str[100]={0};
char *data = str;

while ((NULL != fgets(str, sizeof str, stdin)) && (str[0] != '\n')) {
    if (1 != sscanf(str,"%d",&inp[c])) {
        puts("Input was not an integer, try again.\n");
        continue;
    }
    printf("\ninp[%d] = %d",c,inp[c]);
    c++;
    if (c >= 100) break;
}
}

我添加了我的代码和输出的快照 - Code Output

【问题讨论】:

  • 无法重现您的问题。你能分享你的输入/输出吗?
  • @kiranBiradar 我添加了有问题的屏幕截图。如果有帮助的话。
  • fgets 从流中获取一行,一行需要以换行符结尾以允许后续读取。所以输入一个字符,后跟一个换行符
  • @chux 我试图将该数组中的整数放入一个整数数组中。

标签: c scanf fgets


【解决方案1】:

%n 用于捕获已读取的字节数,因此您需要增加data n 字节以指向下一个数字。

下面的程序读取所有整数,直到空新行。

int main() {
  int inp[100] = {0};

  int c = 0, n = 0;
  char str[100] = {0};
  char *data = str;

  while ((NULL != fgets(str, sizeof str, stdin)) && (str[0] != '\n')) {
    data = str;
    n = 0;
    while (1 == sscanf(data, "%d%n", &inp[c], &n) && c < 100) {
      printf("\ninp[%d] = %d\n", c, inp[c]);
      data += n;
      c++;
  }
}

【讨论】:

  • 这就是我要找的。但是你能解释一下代码吗? %n 做了什么。以及为什么选择data 并增加它。
  • 有没有办法绕过循环结束后再次按回车键。循环后我还有其他功能和操作。但是在运行它时,我必须按两次 Enter 才能退出循环。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2016-08-14
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多