2011-02-10 70 views
1

在命令参数中使用无效输入或-help标志时,会出现段错误。它是Unix expand实用程序的重新创建,它应该以类似的方式处理错误。使用无效输入时出现Segfault

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

当我尝试输入无效或帮助的标志,我得到一个段错误。为什么会这样,因为我在检查第一面旗子是否有帮助?

+1

有一段时间没有做任何C,但不是索引0索引? strcmp(argv [1] ...应该是strcmp(argv [0]等等)? – Gazler 2011-02-10 20:07:53

+1

不,argv [0]是你的可执行文件的名称 – chris 2011-02-10 20:11:07

回答

5

如果一个命令行参数传递给你的程序,argc == 2,所以你需要更换

if (argc==1){ //if only one argument in stack 

if (argc==2){ 

注意,在大多数系统argv[0]是程序名和在这种情况下,argc至少为1.您可以将argc视为argv中的元素数。如果你正在为argv[1]测试,你希望argv至少有两个元素(argv[0]argv[1]),因此argc需要至少2

3

argv[0]计数,所以,如果argc==1argv[1]NULL

如果有时间不超过2参数,因此

if (argc<3) 
    printHelp(); 
else if(...) 
2

在初始化时应当显示您的帮助信息,main的参数将满足以下要求根据this

  • argc大于零。
  • argv[argc]是一个空指针。
  • argv[0]argv[argc-1]是指向其含义将由程序确定的字符串的指针。
  • argv[0]将是一个包含程序名称或空字符串(如果不可用)的字符串。 argv的剩余元素表示提供给程序的参数。在只支持单个字符的情况下,这些字符串的内容将以小写形式提供给程序。

因此,您通过argv[argc](这是一个空指针)到strcmp

相关问题