使用无效输入时的Segfault

时间:2011-02-10 20:00:29

标签: c unix segmentation-fault

在命令参数中使用无效输入或-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);
}

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

3 个答案:

答案 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]至少包含两个元素(argvargv[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