没有时,fgets在空格中阅读

时间:2012-12-14 09:47:07

标签: c fgets

使用fgets()读取字符串。

但是当输入为3个字符的字符串“abc”时,打印大小的print语句打印出来。

这完全破坏了我的方法,因为它为char数组添加了一个空格,使得排列不起作用。

输入文件:

2
abc
bca

我确信琴弦后面没有空格。

int main(){

  FILE * inF;
  inF = fopen ("input2.txt", "r");


  //Find number of Strings
  int numWords = 0;
  fscanf(inF, "%d", &numWords);
  printf("%d\n", numWords);

  int i = 0;
  int counter = 0;
  char string[10000];


  //Run fgets so it starts at second line
  fgets(string, 20, inF);

  while(i< numWords) {

    string[10000] = 0;
    fgets(string, 20, inF);
    printf("char: %s", string);

    //find and print permutations
    counter = strlen(string);
    printf("size: %d\n", counter);
    arrange(string, 0, counter - 1);

    i++;
    }

  return 0;

  }

任何帮助都会很棒,谢谢!

3 个答案:

答案 0 :(得分:1)

第一个fscanf读取数字,但保留换行符。因此,当您稍后致电fgets时,这是fgets读取的空行。

仅使用fgets获取完整的行,如果您需要使用类似scanf的功能,请在该行使用sscanf

答案 1 :(得分:0)

请勿混用fscanf()fgets()

读取第一行的整行,然后使用sscanf()解析该行中的数字,然后继续使用更多fgets()来读取剩余的行。

答案 2 :(得分:0)

您可以在string[]之后打印缓冲区fgets中的内容,如下所示:

...
while(i< numWords) {

string[10000] = 0; // !!! Do you mean string[9999] = 0;
fgets(string, 20, inF);
printf("char: %s", string);

// add printf here
for (j = 0; j < 20; j++)
    printf("%02X ", (unsigned char)string[j]);
printf("\n");

...
}

你会看到这样的结果:

2
char: abc
61 62 63 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
size: 4
char: bca
62 63 61 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
size: 4

如您所见,每0A后都有一个\n,即fgets。然后很明显为什么大小为4

$ man fgets
    ...
    If  a  newline  is  read, it is stored into the buffer.
    ...

因此您可能需要手动删除换行符。