首页 > 解决方案 > c fgets 重复最后一个字符

问题描述

我正在尝试从标准输入读取整数值。我有一个内部 while 循环来检测整数系列,以便我可以解析具有多个字符的整数。我用换行符分隔缓冲区,因为输入可以在多行上包含整数。

我处理这个的代码是:

while (fgets(buf, BUF_SIZE, stdin)) {
    strtok(buf, "\n");
    for(int i = 0; buf[i] != '\0'; i++) {
        size_t j = 0;
        if(isdigit(buf[i])) {
            while(isdigit(buf[i+(int)j])) {
                j++;
            }
            char *new_str = malloc(j*sizeof(char));
            size_t k =0;
            while(k < j) {
                new_str[k] = buf[i+(int)k];
                k++;
            }
            printf("%s\n", new_str);
            free(new_str);
        }
    }
}

输入可能是:1 9 10 10 11

输出应该是:

1
9 
10 
10 
11

我得到的输出是:

1
9
10
0
10
0
11
1

因此,n>1 的输入的每个最后一个字符都会以某种方式被缓冲区读取两次。

我不确定这是怎么可能的,但无法弄清楚。

标签: cstdinfgets

解决方案


发生这种情况是因为您j在输入字符串上增长但您忘记与i一起增长j。所以你增长j,在你打印它之后,你会i从最后一个值增长 1,这i+1将落在已经打印的输入字符串中......

解决方案是重新初始化 i :

        if(isdigit(buf[i])) {
          .....
          free(new_str);
          i = i+j;
        }

推荐阅读