Ошибка сегментации ошибка, если argc принимает только один аргумент. Этого не происходит, когда «ЕСЛИ» находится до того, как В ТО время

#c #if-statement #while-loop #cs50 #caesar-cipher

Вопрос:

Проверьте, не предоставляет ли пользователь аргументов командной строки или более, он печатает ключ Usage: ./caesar. Если аргумент командной строки один, то он проверяет, являются ли все символы в строке цифрами. Если я введу ./caesar в командной строке, я получу ошибку ошибки сегментации. Этого не происходит, когда «ЕСЛИ» находится перед «ПОКА». Я не уверен, почему возникает эта ошибка. Действительно ценю любую помощь!

    #include <stdio.h>
   #include<stdlib.h>
   #include<string.h>
   #include<ctype.h>
   #include<cs50.h>

   int main(int argc, char*argv[])
   {
    string str = argv[1];
    
  //check if argv[1] are all digits
    while(argc == 2)
    {
      for(int i = 0; i< strlen(str); i  )
       {
          if(!isdigit(str[i]))
          {
             printf("Usage: ./caesar key n");
             break;
          }
       }
        break;
    }
    
   // check if argument count is not 2
   if(argc != 2)
    {
       printf("Usage: ./caesar key n");
    }
   
   return 0;

   }
 

Комментарии:

1. if(argc != 2) это должно быть первым делом в вашей программе, прежде string str = argv[1]; чем, и вы должны просто вернуться, если это неправильно. Как только вы это сделаете, в этом while(argc == 2) нет необходимости, потому что вы уже проверили, и это не изменится, если вы не измените это сами.

2. Примечание: Не злоупотребляйте while(...) { ....; break;} как if утверждение. Это не конкурс запутанного кода на языке си. Это if утверждение существует не просто так.

3. Я узнал, почему мой код пошел не так. Если мой аргумент командной строки был ./caesar, то argc = 1 и argv[0] = ./caesar, но компилятор понятия не имеет, что такое argcv[1], так как количество моих аргументов равно единице, и инициализация argv[1] в строку приводит к ошибке сегментации (где я пытался получить доступ к памяти, которой не существовало). Спасибо, ребята, что обратились!

Ответ №1:

./casear argv[0] значение string str = argv[1]; is равно нулю, что приводит к ошибке seg.

Комментарии:

1. Первое было причиной из-за доступа к нулевому указателю, если эта часть исправлена, программа выполняется без ошибок.