1

用于fgets()读取字符串。

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

这完全破坏了我的方法,因为它为 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;

  }

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

4

3 回答 3

1

第一个fscanf读取数字,但留下换行符。因此,当您稍后调用它时,读取fgets的是这个空行。fgets

fgets用于获得完整的行,如果您需要使用scanf类似的功能,则sscanf在该行上使用。

于 2012-12-14T10:01:58.583 回答
0

不要混用fscanf()fgets()

为第一行读取一整行,然后用于sscanf()解析该行中的数字,然后再继续fgets()读取剩余行。

于 2012-12-14T09:51:40.147 回答
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,即。那么为什么大小是显而易见的。\nfgets4

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

因此,您可能必须手动删除换行符。

于 2012-12-14T11:40:53.993 回答