2012-04-15 115 views
2

如果我要讓用戶輸入文件的文件名(允許空格)並驗證它以查看它是否爲錯誤的文件名,我該怎麼做?驗證文件名的用戶輸入

唯一正確的,現在,我能想到的辦法是創建字符數組一樣

char filename[100] 

並使用一個for循環和嵌套if語句來檢查,如果字符串的每一個字符是!@%^*〜|等寫作線這樣的

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

有沒有更好的方法來解決這個問題?因爲如果我這樣做,我會有很多個人if語句來測試所有可能的非法字符。

回答

5

您可以使用strchr,如果返回值不爲空,則發現錯誤的字符。

char bad_chars[] = "[email protected]%^*~|"; 
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"); 
} 
+0

這無疑是最快的方式,誤差不室爲好。 – 2012-04-15 04:12:37

+0

非常感謝,這是一個很好的解決方案! – 2012-04-15 23:51:26

+0

這將忽略空字符串。這也是一個很好的做法。 – 2015-02-24 15:08:32

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; 
} 
+1

+1好方法。兩點意見:1.應該注意的是,這隻適用於POSIX。 2.'regex_t * myregex; ''應該是'regex_t myregex;'然後'regcomp(&myregex,...' – MByD 2012-04-15 03:44:09

+0

謝謝,我應該評論並觀察我的代碼更好一點 – 2012-04-15 04:10:39

0

這可能是一個獨特的解決方案(我沒有你的應用足夠的信息,所以我將它張貼反正),但如果你只想要字母名字,你可以比較字符的範圍這將是一個簡單的(R)if語句的整數值:

如果你想看看它的低/大寫或多項:

//僞 如果(0-9,a-z,A-Z)繼續;

否則拒絕;

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/

+0

寫起來會不會更容易(也更合適):' ...文件名[i]> ='0'&&文件名[i] <='9'...'? – MByD 2012-04-15 04:12:34

+0

不確定,您可以更詳細地說明您的意思更簡單嗎?感覺?更快?我不確定什麼是有效的名字,所以很難提出明確的建議,而不是試圖比較每一個無效的字符,我建議他儘可能將它們分成儘可能大的組。寧願不要使用> =,因爲它通常是2個比較而不是1個,它往往使得它一眼就不那麼容易理解 – 2012-04-15 04:18:03

+1

我的方法沒有問題,我的意思是它更具可讀性,並且不是一些神奇的數字:) – MByD 2012-04-15 04:21:02