счастье рядом
Здравствуйте!
У вас здесь единственное сообщество, которое действительно помогает :) Спасибо вам за это.

Нужно найти проблему в коде (язык Си). Задача: считать введенную строку и подсчитать количество появлений указанной буквы. Считывать и обрабатывать параллельно, с использованием каналов.
После того, как ввожу букву, выдает ошибку сегментации. Что это может быть?



@темы: *nix

Комментарии
26.12.2012 в 09:54

А теперь соберите с -Wall -Werror, посмотрите на предупреждения - и всё станет ясно.
26.12.2012 в 12:04

И тесно облакам.
Вы допустили много грубых ошибок:
- переменная kol неинициализирована, поэтому ее начальное значение случайно. результат, соответственно, тоже.
- sizeof(instr) покажет вам sizeof(char*) (вероятнее всего 4 или 8), а не длину строки. Поэтому read и write работают совсем не так, как вы ожидаете.
- вы читаете строку с помощью fscanf в буфер размера 30. если строка в файле окажется длиннее 29 символов, всё будет плохо. fscanf ничего не знает о длине вашего буфера.
- вы читаете символ с помощью scanf("%s", ...), хотя передаете ему не строку (массив char), а указатель на один char. поэтому здесь почти всегда будет сегфолт. scanf пытается использовать вашу переменную как массив, записав туда всю строку, введенную пользователем, и терминирующий нулевой байт. естественно, в один char это всё не влезает.
- сравнивать символы нельзя через strcmp, только через обычное ==. strcmp ожидает на входе массивы char, терминированные нулевым байтом. поэтому здесь тоже был бы сегфолт.

Ну и еще:
- в printf следует всегда писать в конце перевод строки, чтобы не было проблем с отображением вывода в терминале.
- у вас было много предупреждений компилятора. вы их вообще читаете?

Вот исправленное: gist.github.com/4378812
26.12.2012 в 14:44

- sizeof(instr) покажет вам sizeof(char*) (вероятнее всего 4 или 8), а не длину строки. Поэтому read и write работают совсем не так, как вы ожидаете.
операнд - массив с известной длиной, а потому sizeof вернёт его размер.
05.01.2013 в 23:06

счастье рядом
.Седьмой, спасибо, особенно за ключи, буду пользоваться

Ri, kol не заметила просто, да
== у меня было изначально, мне неправильно подсказали поменять на strcmp
scanf("%c", - за вот это отдельное спасибо! я была уверена почему-то, что если String`а нету в Си, только char, то и ничего для считывания отдельного символа нету, все через %s
и да, цикл while умудрилась забыть ><, но дело было именно в %с, судя по всему
все остальное в моем варианте и так работает
спасибо вам большущее, я билась над этим ооочень долго, а ошибка была в такой мелочи, о которой я и не догадывалась...