2011-09-10 6 views
0

私はscanfは、単一の単語に文章を解析するために使用することができる方法を知っている:`scanf`で文章を解析し、改行を検出できますか?

while(1){ 
    scanf("%s", buffer) 
    ... 
} 

私はone two three<return>のような文を入力すると、単語は私が取得していますしかし、もし、どのように私はwhileループ内で見つけることができますバッファには私が<return>を押す前のものがありますか?

scanfとほとんど同じことだと思いますが、似たような機能がありますか?

答えて

2

あなたが行全体を読み取るためにfgets()を使用し、そのようにそれを解析する必要があります

char buffer[BUFSIZE] = {};  // BUFSIZE should be large enough for one line 
fgets(buffer, BUFSIZE, stdin); // read from standard input, same as scanf 
char *ptr = strtok(buffer, " "); // second argument is a string of delimiters 
            // can be " ,." etc. 
while (ptr != NULL) { 
    printf("Word: '%s'\n", ptr); 

    ptr = strtok(NULL, " ");  // note the NULL 
} 

を現在の単語が最後の単語が存在するかどうかの確認は重要ではありません。

while (ptr != NULL) { 
    char word[BUFSIZE] = {}; 
    strcpy(word, ptr);   // strtok clobbers the string it is parsing 
           // So we copy current string somewhere else. 
    ptr = strtok(NULL, " "); 

    bool is_last_word = (ptr == NULL); 
    // do your thing here with word[] 
} 
+0

あなたは、行が(BUFSIZE-1)文字を超えないことに頼っています。それ以上あれば、fgets()呼び出しの間に単語を壊すことになります。 –

+0

正解ですので、私の側のコメントです。他の唯一の方法は、動的に割り当てられた文字列バッファを使用することですが、これはこの質問の範囲にはありません。さらに、そうするなら、C++をストリングストリームとともに使用する方が良いでしょう。 – evgeny

0

あなたがしている場合最後の言葉だけに興味があるなら、あなたはそれを簡単にやっていくことができます。提示されたfgets()ソリューションは、行がバッファサイズを超えた場合に複雑になりがちです。複数のfgets()呼び出しに単語を分割することができます。あなたはその出来事に対処する用意があるべきです。

scanf()は危険です。それはあなたのバッファに任意の長さの単語を読み込みます。あなたがそれに頼っているならば、常に長さ指定子で%sを使うことを忘れないでください。私はかなりあなたが実際にあなたが必要なものを達成するためにscanf()を使用することはできないと確信しています。

文字単位で入力文字を処理することをお勧めします。あなたがスペースをヒットすると、あなたは言葉が壊れています。改行を押すと、最後の単語になります。

関連する問題