通过 Regex C 验证输入
Validating an input via Regex C
我正在编写一个从用户那里读取文件名的程序。在处理输入之前我想检查文件名是否有效。
我写了一个函数,但它 returns 一切都是正确的。我用 grep 测试了正则表达式,它有效,但它不适用于 C。有人能指出我做错了什么吗。
有效文件名:file.txt file123.txt file_123.txt f123.ext f-123.txt
无效的文件名:123.txt /var/somefile.txt file$.txt...
函数
int *validateString(char *argv){
int *result = malloc(sizeof(int));
*result = 0;
int comp;
regex_t validRegex;
comp = regcomp(&validRegex,"^[a-zA-Z][a-zA-Z0-9_-]*.[a-z]+", REG_EXTENDED | REG_NOSUB);
/*
if(comp){
*result = 0;
return result;
}
*/
if(!regexec(&validRegex, argv, 0, 0, 0)){
*result = 1;
}
return result;
}
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<regex.h>
int *validateString(char *argv);
int main(int argc, char *argv[]){
if(!validateString(argv[1])){
printf("you have entered a wrong regex!\n");
}
return 0;
}
正如 user58697 所指出的,问题是 if 语句总是被评估为真,因为我正在评估指针(而不是 return 值!)。我按照建议取消引用它并且它起作用了。另一个解决方案是 return 一个值而不是函数 validateString 中的一个指针。
我正在编写一个从用户那里读取文件名的程序。在处理输入之前我想检查文件名是否有效。
我写了一个函数,但它 returns 一切都是正确的。我用 grep 测试了正则表达式,它有效,但它不适用于 C。有人能指出我做错了什么吗。
有效文件名:file.txt file123.txt file_123.txt f123.ext f-123.txt
无效的文件名:123.txt /var/somefile.txt file$.txt...
函数
int *validateString(char *argv){
int *result = malloc(sizeof(int));
*result = 0;
int comp;
regex_t validRegex;
comp = regcomp(&validRegex,"^[a-zA-Z][a-zA-Z0-9_-]*.[a-z]+", REG_EXTENDED | REG_NOSUB);
/*
if(comp){
*result = 0;
return result;
}
*/
if(!regexec(&validRegex, argv, 0, 0, 0)){
*result = 1;
}
return result;
}
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<regex.h>
int *validateString(char *argv);
int main(int argc, char *argv[]){
if(!validateString(argv[1])){
printf("you have entered a wrong regex!\n");
}
return 0;
}
正如 user58697 所指出的,问题是 if 语句总是被评估为真,因为我正在评估指针(而不是 return 值!)。我按照建议取消引用它并且它起作用了。另一个解决方案是 return 一个值而不是函数 validateString 中的一个指针。