簡體   English   中英

驗證文件名的用戶輸入

[英]Validating User Input for Filenames

如果我是讓用戶輸入文件的文件名(允許空格)並驗證它是否是一個錯誤的文件名,我該怎么辦呢?

我能想到的唯一方法是創建char數組

char filename[100]

並使用for循環並使用嵌套的if語句來檢查字符串的每個字符是否都是!@%^ *〜| 和像這樣的着作線等

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

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

您可以使用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");
}

你可以試試正則表達式:

#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;
}

這可能是一個獨特的解決方案(我的應用程序沒有足夠的信息,所以無論如何我都會發布),但是如果你只想要字母數字名稱,你可以比較一系列字符的整數值,這很簡單( r)如果聲明:

如果你想看看它是小寫/大寫還是數字:

//偽 if(0-9,az,AZ)繼續;

否則;

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM