2013-06-20 6 views
-1

Вместо того, чтобы наводнять эту страницу на 80 строк C, я загрузил ее в pastebin. http://pastebin.com/b6UDpw0JКак отладить эту ошибку сегментации?

Остальная часть программы работает. Я могу использовать флаги -x и -cx без каких-либо проблем, но использование -c приводит к ошибке сегментации. Я попытался использовать DDD и просто обычный gdb для его отладки, но по какой-то причине я продолжаю получать «Inferior 1 (process 7355) нормально», и, когда я использую «backtrace», я получаю «нет стека».

Как вы, ребята, отлаживаете свои программы? Каким будет ваш подход к отладке этого?

Кроме того, есть ли какие-либо серьезные проблемы с моим кодом? Может быть, некоторые тупые новички, которые я сделал, что я мог бы сделать более эффективно?

Благодаря

+1

http://en.wikipedia.org/wiki/Valgrind –

+1

Вы компилировались с помощью 'gcc -Wall -g'? Ваша 'capizeize' должна заботиться о получении указателя' NULL'! В общем, некоторые '* argv' могут быть' NULL' ... –

+0

Научитесь использовать [getopt_long (3)] (http://man7.org/linux/man-pages/man3/getopt_long.3.html) или [ argp] (http://www.gnu.org/software/libc/manual/html_node/Argp.html) –

ответ

0

Здесь:

void capitalize(char *s){ 
    while(*s != '\0') 
     if(islower(*s)) 
      *(s++) += ('a' - 'A'); 
} 

следует инкремент сек, даже если она не ниже. Также существует функция strupr.

Кроме того, в основном вы должны проверить argc, чтобы узнать, сколько параметров есть. Вы не можете предположить argv [argc] == 0.

+0

Но это сделает цикл программы бесконечно, а не сбой ... –

+0

Welp, я нашел проблему. Я перепутал ASCII в верхнем регистре больше, чем в нижнем регистре. Они не. Я увеличиваю * s только в том случае, если * s является строчным символом. Я увеличил его до некоторого значения, по крайней мере, (char) 129, которого нет в Ascii. –

+0

Не имеет значения, если в верхнем регистре до или после нижнего регистра. Дело в том, что если вы хотите перейти от «a» в «A», вы должны добавить («A» - «a») не («a» - «A»). –