c fgets复制最后一个字符

c fgets复制最后一个字符,c,stdin,fgets,C,Stdin,Fgets,我正在尝试从stdin读取整数值。我有一个内部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])) {

我正在尝试从stdin读取整数值。我有一个内部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
0
10
0
11
1
因此,缓冲区以某种方式读取n>1的输入的最后一个字符两次


我不确定这是怎么可能的,但无法理解。

发生这种情况是因为您在输入字符串上增长了
j
,但忘记了将
I
j
一起增长。因此,您将
j
增长,并且在打印它之后,您将从上一个值开始将
i
增长1,
i+1
将落在已打印的输入字符串中

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

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

不,它不会被“读两遍”。字符串必须以
0
结尾。因为您没有这样做,所以打印这样的字符串是错误的。另外,当您在第一个
循环中处理多个
时,您没有递增
i
。您使用的是
strtok()
,但不接受其结果这回答了您的问题吗?我也认为
malloc(j*sizeof(char))应该是
malloc(j+1)以允许终止符。
        if(isdigit(buf[i])) {
          .....
          free(new_str);
          i = i+j;
        }