1

私は今ピクルスにいます。例の入力を取り込むのに問題があります

1994 ショーシャンクの空に

1994年 パルプ・フィクション

2008 ダークナイト

1957 12人の怒れる男たち

最初に数値を整数に取り込んでから、文字配列を使用して映画の名前を文字列に取り込む必要がありますが、これを行うことができませんでした。

コードATMはこちら

while(scanf("%d", &myear) != EOF)
{
    i = 0;

    while(scanf("%[^\n]", &ch))
    {
        title[i] = ch;
        i++;
    }

    addNode(makeData(title,myear));
}

タイトル配列は任意に大きく、機能はデータをノードとしてリンクされたリストに追加することです。現在、各ノードで取得し続ける出力は次のとおりです

「ハンク・リデンプション」

「イオン」

「騎士」

「男性」

はい、奇妙なことに、カットオフ タイトルの前にスペースが出力されます。変数を確認したところ、データにスペースが追加されました。(年は正しく取り込まれているため、印刷していません)

どうすればこれを修正できますか?

4

1 に答える 1

2

渡された引数の型が正しくありませんscanf()-- 文字をスキャンする代わりに、すぐに文字列バッファをスキャンしてみてください。改行まで (ただし改行は含まない) 文字列全体%[^\n]をスキャンします。1 文字だけをスキャンするわけではありません。

scanf()(限界二次問題: 入力の最後に戻るという考えをどこから得ているのかわかりませんが、EOFそうではありません。間違った仮定をするよりも、ドキュメントを読んだほうがよいでしょう。)


理解していただければ幸いですscanf()。正しく理解するのは難しいです。それは悪です。一度に行全体を入力してから、適切な関数を使用して解析してみませんか?

char buf[LINE_MAX];

while (fgets(buf, sizeof buf, stdin) != NULL) {
    int year = strtol(buf, NULL, 0);

    const char *p = strchr(buf, ' ');
    if (p != NULL) {
        char name[LINE_MAX];
        strcpy(name, p + 1); // safe because strlen(p) <= sizeof(name)
    }
}
于 2013-09-22T18:42:40.930 に答える