2011-10-30 5 views
5

"test"を入力すると、この特定のコードがstrstr()でfalseを返すのはなぜですか?strstrが機能しない

char input[100]; 

int main() 
{ 
    fgets(input, 100, stdin); 
    printf("%s", input); 

    if(strstr("test message", input)) 
    { 
     printf("strstr true"); 

    } 


} 

strstrが2番目のパラメータのインスタンスの最初のパラメータを検索したと思いますか?入力をテキストに置き換えたり、直接何かに割り当てると動作しますが、fgetsではうまく動作しないようです。

+0

問題を処理するには、http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input –

答えて

10

これは、fgetsが改行文字を格納するためです。そうすれば、strstrが比較を行うときに失敗します。 manページから

のfgets()ストリーム からsize文字未満で、ほとんど1で読み込み、バッファにそれらを保存するsが指します。 のEOFまたは改行の後に読み込みが停止します。改行が読み取られた場合、それはバッファに として格納されます。 '\ 0'はバッファ内の最後の文字の後に格納されます。

+0

を削除してください。おそらく+1を取得します。 – FailedDev

+0

@sashangそのドキュメントの部分はまだ混乱しています。それはEOFか改行です。どちらですか?私はチュートリアルを通過していて、それは私に失敗していた。最後の文字をヌル '\ 0 'に置き換えることはやりましたが、チュートリアルでは' fgets'のように見えましたが、実際に '\ n'を置くと' \ 0'が自動的に挿入されます。このため、 'strstr'は機能しませんでした。しかし、なぜその本はそれがうまくいくと言いましたか? – Andy

+0

@Andy: 'EOFまたは改行'は、EOFまたは改行またはその両方を意味します。 'または'ここには論理的なブール値の意味があり、 'や'は口語で使われていない。したがって、どちらも有効な回答です。 – sashang

6

fgetsの後にinput[strlen(input) - 1] = '\0';を追加します。 fgetsは改行文字('\n')を読み込みます。 "test message"には'\n'が存在しないため、inputは決してその中に含まれません。

fgetsを呼び出して改行がバッファの最後にあるかどうかを確認して、実際に行全体が実際に収まるかどうかを確認し、明らかに削除する必要があります。

+0

私は、 'fgets'が' 'Hello" 'を読むとき、実際には' 'Hello \ n \ 0" 'や' 'Hello \ n" 'を読み込むと仮定します。 – Andy

+0

'' Hello \ n "'を読み込み、 ''\ 0' 'で文字列を終了します。しかし、それは読まれる改行文字がある場合のみです。 – AusCBloke

+0

私は質問を言い換えることができます。どのような結果が 'fget'であるべきですか?私は 'strstr'が動作していないので尋ねます。 '変数[strlen(variable)-1] = '\ 0''を実行すると動作します。 'strlen'が長さの文字列を解析するとき、終端のヌル値をスキップしますか?だからHello \ n \ 0 "'、それは改行を含んでいるので6ですか?もしそうなら、結果は '' Hello \ 0 \ 0 "'となるでしょう。途中であなたの時間をありがとう。 – Andy

関連する問題