2

ユーザーにファイルのファイル名を入力させ (スペースを許可)、それが不適切なファイル名であるかどうかを検証するにはどうすればよいでしょうか?

私が考えることができる唯一の方法は、次のようなchar配列を作成することです

char filename[100]

そして for ループを使用し、文字列の各文字が !@%^*~| であるかどうかをチェックする if ステートメントをネストします。これらのような行を書くことによってなど

for(...) {
    if(filename[i] == '@'){...}
    if(filename[i] == '!'){...}
}

これにアプローチするより良い方法はありますか?もし私がそのようにしていたら、可能性のあるすべての不正な文字をテストするためだけに、たくさんの個々の if ステートメントが必要になるからです。

4

3 に答える 3

6

そのために使用できstrchr、戻り値が null でない場合は、悪い文字が見つかりました。

char bad_chars[] = "!@%^*~|";
char invalid_found = FALSE;
int i;
for (i = 0; i < strlen(bad_chars); ++i) {
    if (strchr(filename, bad_chars[i]) != NULL) {
        invalid_found = TRUE;
        break;
    }
}
if (invalid_found) {
    printf("Invalid file name");
}
于 2012-04-15T03:33:30.240 に答える
2

正規表現を試すことができます:

#include <stdlib.h> 
#include <string.h>
#include <regex.h>

int main (void) {
    char fileName[100];
    int comp; 
    regex_t myregex; 

    // Compile the regular expression 
    comp = regcomp(&myregex, "^[a-zA-Z0-9.' '\[\]_-]+$", REG_EXTENDED | REG_NOSUB) ;

    printf("Enter a file name\n");
    scanf("%s",fileName) ; 

    // Compare fileName to the regex 
    if (!regexec(&myregex, fileName, 0 , 0 , 0)) {
        printf("fileName %s is valid.\n", fileName);  
    } else {
        printf("fileName %s is invalid.\n", fileName);
    }
    return 0;
}
于 2012-04-15T03:36:58.253 に答える
0

これはおそらく独自の解決策です(アプリケーションに関する十分な情報がないため、とにかく投稿します)が、英数字の名前のみが必要な場合は、単純な文字範囲の整数値を比較できます( r) if ステートメント:

小文字/大文字または数字かどうかを確認したい場合:

//疑似 if(0-9, az, az)continue;

そうでなければ拒否します。

for(i=0;...;...){
    if((filename[i]==32)||(filename[i]>47 && filename[i]<58 )||(filename[i]>64 && filename[i]<91)||
    (filename[i]>96 && filename[i]<123))
        continue;
else{
...//reject filename
}

または、英数字以外かどうかを確認できます...

for(i=0;...;...){
    if((filename[i]<=47) || (filename[i]<=64 && filename[i]>=58) ||
    (filename[i]<=96 && filename[i]<=91) || (filename[i]<=123)){
        reject;
    else{
        ...//nothing
    }

http://www.asciitable.com/

于 2012-04-15T03:59:09.453 に答える