C:

2017-02-22 5 views
1

のユーザー入力文字列の形式が "%d /%d /%d /%d /%d"であることを確認します。sscanf()を使用して文字列の形式をチェックしようとしました。書式がマッチしていなくても、エラーは表示されません。私は何が間違っているのか分からない。C:

char  *now = 1; // assume this is the user-entered string 
int   year,month,hour,min,sec; 

//CHECKING IF THE ARGUMENT IS CORRECT OR NOT 
if (sscanf(now,"%d/%d/%d/%d/%d\n",&year,&month,&hour,&min,&sec) == 0) 
    { 
     fprintf(stderr,"\x1b[1;31mMust specify correct format\nExiting........\x1b[0m\n"); 
     _exit(1); 
    } 
+1

'char * now = 1'が何をすると思いますか分かりません。ポインタを1に初期化しようとしていますか? – ryyker

+0

...または、最後のコメントをピギーバックして、_ [this sscanf documentation](https://www.tutorialspoint.com/c_standard_library/c_function_sscanf.htm)_による 'EOF'を確認してください。 – ryyker

+0

@ryykerはい。 char * now = 2000/300/2のようにします。 %d /%d /%d /%d /%dの形式ではないので、エラーが出るはずです。 –

答えて

1

sscanf正常(エラーの場合またはEOF)スキャンおよび割り当てられたフィールドの数を返します。 %dのいずれも成功していないかどうか、つまり文字列から数字が解析されていないかどうかを確認しています。つまり、1つの整数を解析できても、ifは実行されません。だから、1つの数が解析できない場合でも、ifを実行

if (sscanf(now, "%d/%d/%d/%d/%d", &year, &month, &hour, &min, &sec) != 5) 

if (sscanf(now,"%d/%d/%d/%d/%d\n",&year,&month,&hour,&min,&sec) == 0) 

を変更。私は\nを削除しました。なぜなら、実際には何の効果もないからです。