在命令参数中使用无效输入或-help
标志时,我遇到了段错误。它是Unix expand
实用程序的重新创建,它应该以类似的方式处理错误。
int main(int argc, char *argv[]){
char help1[]= "-help";
char help2[]= "--help";
int spaces; //number of spaces to replace tabs
if (argc==1){ //if only one argument in stack
//check if asking for help
if ( (strcmp(argv[1], help1)==0) || (strcmp(argv[1], help2)==0) )
printHelp();
else
printError(); //otherwise, print error message
//right number of tokens are provided, need to validate them
} else if (argc>=2){
spaces= atoi(argv[2]); //assign it to spaces
parse_file(spaces); //open the stream and pass on
}
return 0;
}
我的printerror方法:
void printError(){
fprintf(stderr, "\nInvalid Input.\n");
fprintf(stderr, "The proper format is myexpand -[OPTION] [NUMBER OF SPACES]\n");
exit(1);
}
当我尝试无效输入或帮助标记时,我得到一个段错误。为什么这样,因为我正在检查第一个标志是否有帮助?
答案 0 :(得分:5)
如果将单个命令行参数传递给您的程序argc == 2
,那么您需要替换
if (argc==1){ //if only one argument in stack
与
if (argc==2){
请注意,在大多数系统中,argv[0]
是程序名称,在这种情况下argc
至少为1.您可以将argc
视为{{1}中的元素数量}。如果您正在测试argv
,那么您希望argv[1]
至少包含两个元素(argv
和argv[0]
),因此需要argv[1]
至少2。
答案 1 :(得分:3)
argv[0]
也是重要的,所以如果argc==1
argv[1]
是NULL
如果给出的参数少于2个,则应显示您的帮助信息,因此
if (argc<3)
printHelp();
else if(...)
答案 2 :(得分:2)
初始化时,main的参数将根据this满足以下要求。
argc
大于零。argv[argc]
是一个空指针。argv[0]
到argv[argc-1]
是字符串的指针,其含义将由程序决定。argv[0]
将是包含程序名称的字符串,如果不可用,则为空字符串。 argv的剩余元素表示提供给程序的参数。如果只支持单个大小写字符,这些字符串的内容将以小写形式提供给程序。因此,您将argv[argc]
(这是一个空指针)传递给strcmp
。