使用fgets很奇怪

时间:2018-08-27 21:53:13

标签: c fgets

如果我要打印整个字符串,则一切看起来都很好,空格和缩进看起来都很完美(我正在用此代码加载源文件)。

但是,如果我尝试在缓冲区中打印单个字符,我会收到本来应该没有的字母。

例如,如果我打印buffer[2]时得到的字母应该是空格,但是如果我打印整个字符串,则字母不存在。

这是我的代码不起作用:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {

    char *buffer = (char*) malloc(100*sizeof(char));

    FILE *myFile;
    myFile = fopen("thisSourceFile.c", "r");

    if (!myFile) {

        printf("could not open file");
    }
    else {

        while(fgets(buffer,100,myFile)) {

        printf("%c \n",buffer[2]);

        }
    }

    fclose(myFile);
    free(buffer);
    buffer = NULL;

    return 0;
}

输出:

n
 n
 n

 t

 h


 I
 y

 f

 p

 l


 w

 p

 }



 r
 u


 e

正如您所看到的,它是在空白处打印字母。如果我打印整个字符串,这些字母将不存在。

1 个答案:

答案 0 :(得分:0)

如果您有兴趣解析源文件并处理每个字符,这可能是一个解决方案。

但是有两个常数。 charsnum_lines_to_read。 M.M在下面的评论中提到isprint()并不是完全可移植的,并且有些怪癖要注意。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void) {
    const int chars = 100; /* Num chars per line to read */
    const int num_lines_to_read = 3; /* Num lines to read */
    char *buffer = (char*) malloc(chars*sizeof(char));
    int i = 0, j = 0;

    FILE *myFile;
    myFile = fopen("thisSourceFile.c", "r");

    if (myFile == NULL) {
      printf("could not open file");
      fclose(myFile);
      return 1;
    }

    for(i=0; i<num_lines_to_read; i++)
    {
      if(fgets(buffer,chars,myFile) != NULL)
      {
        while(isprint((unsigned char) buffer[j]))
        {  
          printf("%c", (buffer[j]));
          j++;
        }
        j=0;
      }
    }

    fclose(myFile);
    free(buffer);

    return 0;
}

示例输出(本身!)

#include <stdio.h>#include <stdlib.h>#include <ctype.h>