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

Нужно найти проблему в коде (язык Си). Задача: считать введенную строку и подсчитать количество появлений указанной буквы. Считывать и обрабатывать параллельно, с использованием каналов.
После того, как ввожу букву, выдает ошибку сегментации. Что это может быть?
- переменная 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
операнд - массив с известной длиной, а потому sizeof вернёт его размер.
Ri, kol не заметила просто, да
== у меня было изначально, мне неправильно подсказали поменять на strcmp
scanf("%c", - за вот это отдельное спасибо! я была уверена почему-то, что если String`а нету в Си, только char, то и ничего для считывания отдельного символа нету, все через %s
и да, цикл while умудрилась забыть ><, но дело было именно в %с, судя по всему
все остальное в моем варианте и так работает
спасибо вам большущее, я билась над этим ооочень долго, а ошибка была в такой мелочи, о которой я и не догадывалась...