1

fgets()文字列を読み取るために使用します。

しかし、入力が3文字の文字列「abc」の場合、サイズを出力するprintステートメントは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を使用する必要がある場合は、その行で使用します。scanfsscanf

于 2012-12-14T10:01:58.583 に答える
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 に答える
0

fscanf()とを混ぜないでくださいfgets()

最初の行の行全体を読み取り、次に を使用sscanf()してその行から数値を解析してから、さらに続けてfgets()残りの行を読み取ります。

于 2012-12-14T09:51:40.147 に答える