0

テキスト ファイルに 2 つの整数と、テキストの行を保存する必要があります。各intを1行に、テキストの各行を新しい行に書き込むことで、成功しました。しかし、それを読むために、私はいくつかの問題を見つけました。私はこれをやっています:

FILE *f = fopen(arquivo, "r");
char *lna = NULL;
fscanf(f, "%d\n%d\n", &maxCol, &maxLin);
//↑This reads the two ints, works fine in step-by-step
for (;;) {
    fscanf(f, "%s\n", &lna);
    //↑This sets lna to NULL always, even if there are more lines
    if (lna != NULL)
        lna[strlen(lna) - 1] = '\0';
    if (feof(f))
        break;
    inserirApos(lista, lna, &atual);
}
fclose(f);

私はいくつかの異なる方法を試しましたが、うまくいきませんでした。get などを使用して、文字列のようにすべてを読み取ることができることは理解していますが、文字列にスペースが含まれていると問題があると思います。自分のやり方がベストなのか、どこが悪いのか知りたかったのです。各行の最大長を渡す必要があるこれらの方法の 1 つ (どちらも機能しませんでした) を見つけました。必要に応じてこの情報を知っています。以前に読んだ maxCol です。

4

3 に答える 3

2
fscanf(f, "%s\n", &lna);

引数のタイプが間違っています。フォーマットは引数として%saを期待しますが、あなたはそれにを与えました。そして、あなたはそのポインタにメモリを割り当てていません。十分な大きさのメモリ領域を指すことを期待します。char*char**fscanfchar*

char *lna = malloc(whatever_you_need);
...
    fscanf("%s ", lna);

'\n'(と' 'の形式に違いはありませんfscanf。どちらも、intでスキャンされた非空白文字の文字列に続く空白全体を消費しますlna。)

于 2012-11-19T14:38:38.817 に答える
1

最初にlna用のスペースを割り当てる必要があります。

char *lna = malloc(MAX_SIZE);//MAX_SIZE is the maximum size the string can be + 1 

追加の引数は、フォーマット文字列内の対応するフォーマット指定子によって指定されたタイプのすでに割り当てられたオブジェクトを指している必要があります。

于 2012-11-19T14:37:43.057 に答える
1

fscanf()文字列を動的に割り当てることを期待しているようです。それはまったくそれがどのように機能するかではありません。これは未定義の動作です。

于 2012-11-19T14:38:05.487 に答える