#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 пропускает первые два символа в строке сравнения. Но, как я уже писал: ваш дизайн профессоров плох — очень плох.