0

sscanf行が常にtrueと評価されているという問題が発生しています。fgetsが数字のない文字列を渡した場合にfalseと評価したいのですが...ここでアドバイス/ヘルプはありますか?

int main(void){
  int choice;
  char buffer[LINESIZE];

 while (1){
   printf("\nprompt");

   if(fgets(buffer,LINESIZE, stdin)){
        if(sscanf(buffer, "%d", &choice)){
     /* do something*/ 
     else 
      /*do something else*/
4

1 に答える 1

1

コメントで述べたように、sscanf() は一致した引数の数を返します。C の標準的な動作は、0 が暗黙的に FALSE にキャストされ、それ以外はすべて true にキャストされることです。そのため、文字列に常に整数が含まれていて常に何かを読み取るか、コンパイラが奇妙なことを行っているかの 2 つのことが発生していると思います。 0 を true にキャスト (非常に奇妙)

ただし、どちらの場合も、次のようにコードを変更してこれを修正できます

int main(void){
  int choice;
  char buffer[LINESIZE];

 while (1){
   printf("\nprompt");

   if(fgets(buffer,LINESIZE, stdin)){
        if(sscanf(buffer, "%d", &choice) != 0){  // be carefull with EOF 
     /* do something*/ 
     else 
      /*do something else*/

必要な結果が得られ、はるかに読みやすいコードが得られます (奇妙なキャストを行わないため、正しいコードになります)。

于 2013-01-30T18:24:56.230 に答える