Ошибка сегментации(сброс ядра) при доступе к аргументам программы

#c

Вопрос:

В настоящее время я работаю над заданием, и, хотя я еще не закончил, у меня есть базовый вложенный цикл, который компилируется в интерфейсе unix. Но когда я пытаюсь запустить его, я получаю ошибку Ошибки сегментации(Сброс ядра). Кто — нибудь знает, в чем причина этого? Помимо цикла, все остальное-это шаблон, данный нам профессором, и я попытался переместить массив Морзе в основной метод, но все равно получаю ошибку. Вот мой код:

 #include lt;stdio.hgt; #include lt;ctype.hgt; #include lt;string.hgt;  /**  * Short description in 2 - 3 sentences.  *  * @author Lastname, Firstname  * @assignment ICS 212 Assignment XX  * @date Today's date  */  #define SIZE 36  const char *morse[SIZE] = {  "0 -----",  "1 .----",  "2 ..---",  "3 ...--",  "4 ....-",  "5 .....",  "6 -....",  "7 --...",  "8 ---..",  "9 ----.",  "a .-",  "b -...",  "c -.-.",  "d -..",  "e .",  "f ..-.",  "g --.",  "h ....",  "i ..",  "j .---",  "k -.-",  "l .-..",  "m --",  "n -.",  "o ---",  "p .--.",  "q --.-",  "r .-.",  "s ...",  "t -",  "u ..-",  "v ...-",  "w .--",  "x -..-",  "y -.--",  "z --..", };  int main(int argc, char *argv[]) {  int i, j;  // error checking   // loop through the command line input  for (i = 0; i lt;= argc; i  ) {  for (j = 0; j lt; 7; j  ) {  if ((argv[i 1][j] == morse[i][j]) amp;amp; ((argv[i 1][j] == '') amp;amp; (morse[i][j] == ''))) {  printf("%c", morse[i][0]);  break;  }  if (argv[i 1][j] != morse[i][j]) {  break;  }  if (argv[i 1][j] == morse[i][j]) {  continue;  }  }  }  // convert Morse Code to letter   return 0; }  

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

1. i lt;= argc и затем argv[i 1]

2. Напишите пример того, как вы запускаете программу, а также напишите ошибку.

3. Голосование за закрытие как простая опечатка. Эти часто задаваемые вопросы «Я написал, что я

Ответ №1:

Для аргументов программы правилом являются:

 argv[0] char* to program name (or empty string) argv[1] char* to first program argument argv[2] char* to second program argument ... argv[argc-1] char* to last program argument argv[argc] char* equal to NULL  

Таким образом, ваш код должен смотреть только на диапазон argv[1] до argv[argc-1]

Но здесь:

 for (i = 0; i lt;= argc; i  ) {  for (j = 0; j lt; 7; j  ) {  if ((argv[i 1][j] ...  ^^^  since i can equal argc this is accessing argv[argc 1]  that is out of bounds.  Already argv[argc] will cause problems as it is NULL  and dereferencing a NULL pointer will fail  

Чтобы исправить это, убедитесь, что вы никогда не заходите дальше argv[argc-1]

И это

 for (j = 0; j lt; 7; j  ) {  

это довольно «опасно», так как 1) пользователь может дать более короткую строку и 2) некоторые morse коды короче. Вместо этого вы должны проверить strlen как ввод, так и morse код или прервать цикл, как только a '' будет найден в одной из строк.

Эта часть

 if (argv[i 1][j] == morse[i][j]) {  continue;  }  

в этом нет необходимости. Вы уже находитесь в конце цикла, так что это continue все равно произойдет. Просто удалите код.

Помимо цикла, все остальное-это шаблон, данный нам профессором

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

В любом случае… ваш код не зацикливает весь morse массив. Вы пытаетесь сравнить только с одной записью. Это ошибка.

Чтобы исправить это, попробуйте, как:

 for (i = 1; i lt; argc; i  ) {  for (j = 0; j lt; SIZE; j  ) {  if (strcmp(argv[i], morse[j]   2) == 0) {  printf("%c", morse[j][0]);  break;  }  } }  

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

1. omfg ты в основном сделал за меня домашнее задание с помощью этого цикла. хотя мне нужно было просто решить эту ошибку сегментации, я вам очень благодарен. Я не знал, что ты можешь 2 в функции strcmp, Господи

2. @Hammahness808 2 пропускает первые два символа в строке сравнения. Но, как я уже писал: ваш дизайн профессоров плох — очень плох.