2016-11-19 5 views
0
while(scanf("%s",a)) 
{ 

    if(a[0]=='#') 
    break; 
    nextpermutation(a); 
} 

このwhileループは完全にscanfのために働く" が、私は(scanf関数を置く場合"%[^ \ n] s"、a)その間に一度だけ実行する scanfの両方の戻り値を確認しても同じであることを確認しました なぜこれが起こっているのかわかりませんでした...違いは、(%sの")

あなたの scanf("%[^\n]s")がが含まれている何 s%[^\n]sにそこに行っていることです?

+2

をscanf' 'の邪悪を実現し、あなたの代わりに'のstd :: cin'を使用する必要があることですか? –

+1

'%s'は先頭の空白を破棄しますが、'%[set] 'は空白になりません。最初の呼び出しでは、ストリームに残っている '\ n'文字まで読み込みますが、これは含まれません。 2番目の呼び出しでは、 '%[^ \ n]'は最初の文字が '\ n 'なので文字を取得できません。 –

+0

'%99 [^ \ n]' ' - 文字列の先頭のスペース(空白を無視する)と99文字の制限(バッファをあふれさせない)をメモしてください。 –

答えて

1

フォーマット文字列にフォーマット指定子:%[^\n]とそれに続く唯一のsがあります。これにより、%[^\n]でマッチしたシーケンスの後に入力ストリームにsが含まれている必要があります。これは、当然のことながら、行動が非常に近い%sではありません。これらのフォーマットのマッチングシーケンスは、その理由だけでは非常に異なります。

[]は、誤って信じているように、%sフォーマットの修飾語ではありません。 []scanfは、自己完結型のフォーマット指定子です。万一%[^\n]sの代わりにちょうど%[^\n]を意味しましたか?

1

2つの敗者の戦い:"%s""%[^\n]s"

どちら指定子は悪いであり、所属していないが堅牢なコードです。ユーザーの入力を制限することも、宛先バッファーを簡単にオーバーランさせることもありません。

s"%[^\n]s"としています。 @Jonathan Leffler。だから"%[^\n]"は次のように見直されています。

"%s"は、先頭の空白を消費します。先頭文字が'\n'ある場合"%[^\n]"@Igor Tandetnik

"%[^\n]"a変わらないか、まれに不明な状態で残し、何もを読み込みません。

"%[^\n]"は、'\n'を除くすべての文字を読み取ります。

"%s"は、すべての先頭の空白を読み取り、破棄し、空白以外のすべての文字を読み込んで保存します。


fgets()を使用してユーザー入力を読み取って解析する方がよいことがあります。

例:スペースを含む、入力のラインを読むために:あなたは

char a[100]; 
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error(); 

// if the potential trailing \n is not wanted 
a[strcspn(a, "\n")] = '\0'; 
関連する問題