Segfault при использовании неверного ввода - PullRequest
1 голос
/ 10 февраля 2011

Я получаю сообщение об ошибке при использовании неверного ввода или флага -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;

}

Мой метод принтера:

void printError(){
  fprintf(stderr, "\nInvalid Input.\n");
  fprintf(stderr, "The proper format is myexpand -[OPTION] [NUMBER OF SPACES]\n");
  exit(1);
}

Когда я пытаюсь ввести неверный ввод или флаг справки, я получаю сообщение об ошибке. Почему, так как я проверяю, является ли первый флаг справкой?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Если в вашу программу передан один параметр командной строки, 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 голосов
/ 10 февраля 2011

argv[0] тоже имеет значение, поэтому, если argc==1 argv[1] равно NULL

Ваше справочное сообщение должно отображаться, если задано менее 2 параметров, следовательно,

if (argc<3)
    printHelp();
else if(...)
2 голосов
/ 10 февраля 2011

После инициализации аргументы main будут соответствовать следующим требованиям согласно this .

  • argc больше нуля.
  • argv[argc] - нулевой указатель.
  • argv[0] - argv[argc-1] - указатели на строки, значение которых будет определяться программой.
  • argv[0] будет строкой, содержащей имя программы или нулевую строку, если она недоступна. Остальные элементы argv представляют аргументы, предоставленные программе. В случаях, когда поддерживаются только символы в одном регистре, содержимое этих строк будет передано программе в нижнем регистре.

Таким образом, вы передаете argv[argc] (который является нулевым указателем) на strcmp.

...