验证文件名的用户输入

时间:2012-04-15 03:14:33

标签: c

如果我要让用户输入文件的文件名(允许空格)并验证它是否是错误的文件名,我该怎么做?

我能想到的唯一方法是创建像

这样的字符数组
char filename[100]

并使用for循环并嵌套if语句来检查字符串的每个字符是否都是!@%^ *〜|和像这样的文字行等

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

有更好的方法来解决这个问题吗?因为如果我这样做,我会有很多个人if语句来测试所有可能的非法字符。

3 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这可能是一个独特的解决方案(我的应用程序没有足够的信息,所以无论如何我都会发布),但是如果你只想要字母数字名称,你可以比较一系列字符的整数值。一个简单的(r)if语句:

如果您想查看它是小写/大写还是数字:

<强> //伪 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/

相关问题