LINUX.ORG.RU

Учебный исходник Си вываливается с Segmentation fault.


0

0
#include<stdio.h>
int main(void)
{
        char ch;
        puts("Press any key");
        ch=getchar();
        printf("Key=%s",ch);


return(0);
}

При компиляции выводится сообщение:

test.c: In function ‘main’:

test.c:7: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

Программа успешно запускается, но вываливается с Segmentation fault после ввода любого символа.



Последнее исправление: aaz893 (всего исправлений: 1)

Ответ на: комментарий от aaz893

Ну да, читтерство. Мы собрали строку из составляющих. :)

Кстати, еще один немаловажный вопрос. Где под нее выделяется память? Память под нее выделена на стеке. Для учебного примера - сойдет. Но если будешь работать со строками серьезно, посмотри про выделение памяти в куче.

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Кстати, Eddy_Em, а какое впечатление на тебя производит тот учебник, ссылку на который я тебе дал?

aaz893
() автор топика

Всего не читал (не осуждаю), но : 1. Таки %s будет выводить строку (пока не встрить \0). 2. getchar() возвращает unsigned char, преобразованный в int. Поэтому читать k&r и использовать int для ch (ибо может быть и -1).

GreenBag ★★
()
Ответ на: комментарий от gear

«Дистрибутив тоже не мешало бы сменить на что-то вменяемое.» Проблема решилась просто. Оказалось, что надо было просто установить man-страницы для разработчиков.

aaz893
() автор топика
Ответ на: комментарий от aaz893

Поиск нормальной литературы - это самое геморройное место, когда начинаешь в чем-то новом разбираться.

gear ★★★
()

Поищи к своему учебнику список опечаток в интернете, а то ты так с каждым примером будешь бегать.

fenris ★★★★★
()
Ответ на: комментарий от Eddy_Em

«Черт его знает: совершенно нечитабельный формат. pdf нужно или на худой конец djvu.»

Это ты про html?

aaz893
() автор топика
Ответ на: комментарий от fenris

«Поищи к своему учебнику список опечаток в интернете, а то ты так с каждым примером будешь бегать.»

Тот учебник, из которого я взял пример, был написан одним учителем информатики на своем сайте для своих нужд(и коллег). Поэтому, такого списка для него нет.

aaz893
() автор топика
Ответ на: комментарий от aaz893

Фиг его знает. Чтобы адекватно оценить доку, её нужно прочесть.

gear ★★★
()

Думаю топик уже исчерпан. Всем всего хорошего. А mono я советую беречь здоровье и не нервничать по пустякам.

aaz893
() автор топика
Ответ на: комментарий от aaz893

Тот учебник, из которого я взял пример, был написан одним учителем информатики на своем сайте для своих нужд(и коллег).

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

Manhunt ★★★★★
()
Ответ на: комментарий от aaz893

ozon.ru - некомпетентен.
Вот если бы на Ответы@mail.ru такая информация была, тогда это достойно уважения и внимания.

trex6 ★★★★★
()

«Key=%s»,ch

На виндусовской msvs будет работать.

Точнее-будет работать только в определенной версии msvs,толи 2003 толи 2005 непомню уже.

Там при попытке глобально решить проблему с юникодом,сделали при компиляции той версией студии-по умолчанию преобразование в ссылку на строку которая хранила символ в юникоде,который при обращении обрабатывал фреймворк студии.Вобщем оно работало благодаря тому что из-за инвалидного юникода в той версии студии на уровне компилятора все char были строками.

И да,ТС-не слушай линуксоидов.Продолжай учиться по сертифицированным учебникам микрософт!

anonymous
()
Ответ на: комментарий от anonymous

А в текущей версии студии это тоже будет работать,но нужны небольшие манипуляции в опциях-указать юникод по дефолту,и поколдовать с именами функций принтф(используя юникодовскую и неюникодовскую)

anonymous
()
Ответ на: комментарий от aaz893

«Я только не пойму, какого хрена вы просите тут помощи?» А что?

Человек, взывающий к помощи, но отвергающий ее или идиот, или тролль. Вполне возможно, что он и идиот, и тролль одновременно.

andreyu ★★★★★
()
Ответ на: комментарий от aaz893

Тогда не выкидывайте учебник, но обращайте внимание на предупреждения компилятора. Можно даже добавить к флагам компилятора -Werror, дабы предупреждения автоматически воспринимались как варнинги.

Наиболее точная информация даётся в man, хотя как учебник он не годится, конечно. Функция printf во время работы программы анализирует первый аргумент и печатает строку, подставляя в нужных местах нужные аргументы. О типах аргументов она ничего не знает и проверить не может, значение переменной типа char считается адресом в памяти, программа пытается обратиться к ней и падает.

К счастью, GCC умеет анализировать первый аргумент printf при компиляции. А ещё можно заменить GCC на clang, у него более удобные диагностические сообщения.

quiet_readonly ★★★★
()
Ответ на: комментарий от aaz893

Как уже сказали, автор учебника сделал его для галочки - в частности, закончившим аспирантуру ЕМНИП надо набрать публикаций для дальнейшей защиты диссертаций и т.д. Такая вот у нас страна, что все ругают Путина, а тем временем в вузах вместо ведения опенсурсных проектов (как в США) получают гранты, тискают книжки или пишут говнокод в 2003 студии, который иногда даже работает.

Фильтруйте содержимое этой книги, она писалась под давно устаревшей и криво слабанной visual studio 2003, от которой и MS уже открестилась. Варнинги помогут.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

А ещё можно

И нужно-пользоваться тем что рекомендовано в учебнике,а учебник-по микрософтовскому компилятору,а не по свободным поделиям(которые и так никому ненужны)

anonymous
()
Ответ на: комментарий от quiet_readonly

visual studio 2003 vs visual studio 2012?

.net во все поля.
Во имя прогресса-ктонить должен же насильно впаривать инертным массам сишников,православные технологии .Net

И плевать что Си транслируется в C# как unsafe,так еще и течет по страшному-давая еще один повод сишникам стать на путь истенный!
И плевать на гигабайтные зависимости от .net простого хеловорда на Си.
Все во имя прогресса!Да здравствует светлое будущее Микрософт+.Net

anonymous
()
Ответ на: комментарий от aaz893

test.c:7: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

потому что ты дебил и читать не умеешь. Уйди с моего лора.

anonymous
()
Ответ на: комментарий от aaz893

Это уже четвертый, если даже не пятый учебник. Такое впечатление, что все нормальные учебники куда-то спрятались.

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

tensai_cirno ★★★★★
()
Ответ на: комментарий от hibou

Нафиг этот график?

return 0 — если все ОК

return число — если ошибка.

Eddy_Em ☆☆☆☆☆
()

K&R читал? Прочти про строку формата в *scanf/*printf и не мучься.

LongLiveUbuntu ★★★★★
()

Орава старожилов чуть ли не через пожалуйста просит молодого тролловатого полуидиота почитать кнр вместо того, чтобы постить сюда свой тупачок. Где старый добрый лор? Забаньте его уже наконец.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Хз, троллю могло бы и надоесть уже. Здесь пациент пишет о себе.

Deleted
()
Ответ на: комментарий от Deleted

K&R - это классика,и читать придется все равно.

Умному достаточно прочитать спеку на язык. А дураку учебники не помогут, даже хорошие.

geekless ★★
()
Ответ на: комментарий от aaz893

оно ожидает %s указатель на цепочку символов где последний символ null

если сможеш разместить null после своего символа то вперёд бери его адрес и используй как строку.

зы. K&R у тебя может не пойти, начни с кочана и или кинга

qulinxao ★★☆
()
Ответ на: комментарий от AptGet

А насрать. Я люблю отрицательные числа возвращать в случае неудачи.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от aaz893

А мне процитировать Ozon.ru, на котором говорится, что это не лучший выбор для новичков?

Бгг... Интересно послушать урода который это писал, знатный видимо клоун))))))

quest ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.