2016-10-24 4 views
0

ユーザー入力を検証し、正規の文字(0-9、A-Z、およびa-zの組み合わせ)のみを入力するようにします。Cでscanfを使用している正規表現を一致させる

これは私が持っているものですが、 "adsifj%a %% dosif"のような一致する文字列です。私は欲しくない。それらの無効な文字が最初にあった場合は一致しません。これをどうすれば解決できますか?

編集

int main(){ 
char name[128]; 

int match = scanf(" %[0-9a-zA-Z^\n]", name); 
printf("%d", match);  

if (match == 1){ 
    printf("Matched"); 
}else{ 
    printf("Invalid"); 
} 
return 0; 

}

+1

変数の一致は、まず文字の配列(別名文字列)である必要があります。 – Module

+2

スキャンセットの '^'は疑わしいです。 – EOF

+0

'scanf'は真の正規表現をサポートしていないので、あなたが望むことをしません。別の方法としては、文字列を読み取ってから、文字列を 'strspn'でチェックすることです。 – user3386109

答えて

1

の代わりに:あなたが書くべき

int match = scanf(" %[0-9a-zA-Z^\n]", name); 

char line[80], name[80]; 
char toomuch; 

if (fgets(line, sizeof line, stdin) != NULL && sscanf(line, " %79[0-9A-Za-z] %c", name, &toomuch) == 1) { 
    printf("name=(%s)\n", name); 
} 

まず、fgetsを使用して完全なラインをお読みください。次に、sscanfを使用してその行をトークンに分割します。最初のトークンは通常の名前で、2番目のトークンは空白でない名前の次の文字です。

入力が有効なのは、行が空白で構成され、その後に通常の単語が続き、その後に空白があり、その後で終了する場合です。他の文字が残ってはいけません。このため、私は2つのトークン(名前とそのまま)を読んでいますが、1が正常に読み込まれることを期待するだけです(== 1)。

fgetssscanfの間で作業を分割する必要があります。 scanf(" %80[0-9A-Za-z] %c", name, &toomuch)に結合されている場合は、特に正規の正規名を入力するときに、%cは2番目の行を読み込む必要があります。

%79には、sscanfの引数に注意してください。バッファオーバーフローを防止する必要があります。

+0

'まず、fgetsを使って完全な行を読んでください.' scanfには何が問題なのですか? – Michi

+0

@Michi私は第3段落でそれを説明しました。 –

+0

私の主張は、ここでは 'scanf'はひどい選択であり、正しく使われる方法を示す代わりに、あなたには"より良い代替 "を示すということです。 'scanf'は間違っていませんが、これは常にすべて使用されています。WRONG – Michi

1

あなたのコードは次のようになります私はあなたの名前の配列のサイズを一致させるためのコードを編集しました。

char name[128]; 
int match = scanf("%127[0-9A-Za-z]", name); 
if (match == 1) { 
    printf("Success.%s.\n", name); 
} else { 
    puts("There exist non-matching characters"); 
    // To read all non matching characters 
    fgetc(stdin); 
} 
関連する問題