Порядок ввода чисел и знаков однозначен, оказывается (Сперва вводим знаки, потом цифры, но не наоборот!)

Модератор: Модераторы разделов

v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение v04bvs »

promov писал(а):
04.11.2007 15:38
И значит, наше предположение о том, что в char [2] элемент с[0] для хранения символа '10' не нужен, верно.

Программа некорректна. То, что она работает, счастливая случайность, с тем же успехом она может и не работать.
Используйте valgrind, он подобные ошибки отлавливает на раз.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение promov »

Приготовил контраргументы из 3-х книжек, но заметил Ваше присутствие и решил подождать.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение sergio »

promov писал(а):
04.11.2007 15:38
Почему обхявлять char c[2], а не char c[1]? Кольскоро sergio ответ на этот вопрос не предоставил, я попытался ответить на него сам. Вот ответ: char c[2] нужен для того, чтобы компилятор в с[1] поместил символ конца строки. (Но не для того, конечно, чтобы в с[0] ,был помещён символ '10'). А раз так, попробую объявить строку с длиной 1, а, следовательно, спецификатор %1s примет вид %s. Вот новый код:

В c[1] все равно будет помещен символ новой строки (только не комплиятором, а scanf-ом), только теперь он будет записан за пределы заказанного массива, и либо затрет другие данные, либо вызовет сегфолт. Кроме того, убрав спецификатор ширины строки, вы разрешили ввод любой наличествующей строки. Если на входе окажется не одинокая буква, окруженная вайт-спейсными символами, а последовательность из десяти букв (или десяти тысяч...) - все они будут записаны по адресам c[0] .. c [9], и в c[10] будет записан "конец строки".
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение promov »

(Вы имели ввиду символ конца строки...)
sergio писал(а):
04.11.2007 18:11
В c[1] все равно будет помещен символ новой строки (только не комплиятором, а scanf-ом)


То, что Вы сказали, очень важно! У меня ведь как в книге написано? Если места мало выделил, то
"...компилятор не сможет разместить в конце строки нулевой символ, т. к. для него не выделено места" Всё! И ни слова, ни полслова о том, что куда-то, да он будет вставлен безусловно и делов там наделает...

Ну так тогда всё понятно- сhar a [2], a [0]- это искомый отображаемый символ (повторюсь, ни в в коем случае не <Enter>), a [1]- символ конца строки. Cпасибо!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 512
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение Red Gremlin »

<>
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Порядок ввода чисел и знаков однозначен, оказывается

Сообщение drBatty »

promov писал(а):
04.11.2007 19:02
(повторюсь, ни в в коем случае не <Enter>), a [1]- символ конца строки. Cпасибо!

Я уже писал, что использовать gets() нельзя. scanf("%s", char*) тоже самое, и её тоже нельзя использовать. Вот, у тебя даже от порядка объявления зависила работа, а может всё это кончится намного хуже.
ЗЫЖ Забыл написать: для ввода строк пользуйся fgets(), а scanf'ом не советую вообще пользоватся, в конце концов, ты в терминале ниче5го кроме строки не введёшь, если это число - переведи его например atol()
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: