Форум программистов, компьютерный форум, киберфорум
Наши страницы
Комментарии
Войти
Регистрация
Восстановить пароль
  1. Старый комментарий
    Несколько слов о чтении данных с консоли и языке Си
    Зашел по ссылке из какого-то поста из Си раздела для начинающих, просмотрел статью - полезно. Но в 3ем разделе 2й и 3й примеры с потенциальным выходом за границу массива.
    Автора как я понял давно тут нет - править некому. Будьте внимательны.
    Запись от prik размещена 18.11.2018 в 17:09 prik вне форума
  2. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    Вот тут вариант с динамическим наращиванием буфера, если нужно работать с длинными строками
    http://www.cyberforum.ru/cpp-beginners/thread1530754.html#post8073917
    Запись от Evg размещена 14.09.2015 в 23:31 Evg на форуме
  3. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    GNU'шники даже тут ухитрились сделать полезное для человечества
    http://www.gnu.org/software/libc/man...ing-Input.html
    Запись от Evg размещена 14.09.2015 в 23:02 Evg на форуме
  4. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    В разделе 2 для программы на Си используется тэг code, из-за чего раскраска перекосилась
    Запись от Evg размещена 03.03.2014 в 09:02 Evg на форуме
  5. Старый комментарий
    Аватар для fasked
    Несколько слов о чтении данных с консоли и языке Си
    #pragma, безусловно все так и есть. Когда писал этот пример, я, к сожлению, о многих вещах просто не задумывался и не учел их.
    Запись от fasked размещена 08.08.2012 в 09:52 fasked вне форума
  6. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    Наверное две обработки ошибки поставлены рядом для красоты (вторая обработка должна быть после strtod, а первая пофиг где). Но в целом я согласен - правильнее было бы сначала проверить length и только потом вызывать strtod
    Запись от Evg размещена 07.08.2012 в 21:40 Evg на форуме
  7. Старый комментарий
    Аватар для #pragma
    Несколько слов о чтении данных с консоли и языке Си
    Есть ещё один неясный момент:
    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
            /* Перевод из строки в число */
            errno = 0;
            *value = strtod(buf, &end);
     
            /* Обработка ошибок */ 
            if (length == 0) {
                fprintf(stderr, "Ошибка: введена пустая строка.\n");
                return 1;
            }
            if (errno != 0 || *end != '\0') {
                fprintf(stderr, "Ошибка: некорректный символ.\n");
                fprintf(stderr, "\t%s\n" , buf);
                fprintf(stderr, "\t%*c\n", (int)(end - buf) + 1, '^');
                return 1;
            }
    Функция сначала меняет значение value, и только потом обрабатывает ошибки. Не логичнее ли сделать изменение value, когда ошибки уже обработаны (не включая errno)? Или вообще изменять value только как последнее действие перед выходом из функции (завести внутри функции double-переменную или что-то в этом духе)?
    Не хочу придираться, мне самому интересно: если функция безопасна, нужно ли следовать данной логике, - чтобы она меняла значения переданных параметров только при успешной отработке, а при неудачной не меняла их?

    Не по теме:

    Я понимаю, что пример тестовый, просто он для самых начинающих, пусть делают правильно (если это правильно) :).

    Запись от #pragma размещена 07.08.2012 в 15:45 #pragma вне форума
    Обновил(-а) #pragma 07.08.2012 в 19:23
  8. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    #pragma, это всего лишь тестовый пример, но не попытка сделать универсальную независимую функцию ввода double'а. Функцию, которая внутри себя делает какие-то печати, нельзя делать универсальной. Для реализации универсальной функции нужно в ней оставить только процесс ввода и возвращать код результата: ok, в функцию переданы некорректные данные, введена пустая строка, некорректный символ в входной строке и т.п. А когда ты делаешь функцию, которая универсальна в рамках одной программы (но не в абсолютном значении), то вполне можно и так реализовывать, потому что при реализации конкретно данной программы ты сам с собой договорился, что параметры будут передаваться корректно
    Запись от Evg размещена 07.08.2012 в 09:14 Evg на форуме
  9. Старый комментарий
    Аватар для #pragma
    Несколько слов о чтении данных с консоли и языке Си

    Вопрос по логике построения кода

    fasked, а почему ты выбрал в функции безопасного ввода double именно
    C
    1
    2
    3
    
        /* Проверка параметров */
        assert(value);
        assert(prompt);
    ? Почему не проверку на NULL и передачу управления вызывающей функции с выводом сообщения об ошибке? Например, программа могла выделять динамическую память, и перед выходом из программы её стоит освобождать, или не нужно?

    Не по теме:

    Пост полезный, очень детальный подход к проблеме.

    Запись от #pragma размещена 06.08.2012 в 23:33 #pragma вне форума
  10. Старый комментарий
    Несколько слов о чтении данных с консоли и языке Си
    [url]http://www.cyberforum.ru/c-beginners/thread630861.html#post3318854[/url]
    Запись от alkagolik размещена 01.08.2012 в 20:22 alkagolik вне форума
  11. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    Цитата:
    Сообщение от fasked Просмотреть комментарий
    А смысл есть ли? Суть та же самая
    Смысла нет для того, кто всё знает. Для тех, кто прочёл статью с условно нулевым уровнем входа - смысл есть. Спроецировать одно на другое для начинающего не всегда будет тривиально. Хотя я бы сделал немного наоборот. В качестве первого пояснения добавил бы пояснение на примере ввода yes/no, а пример ввода double'а, как более сложный, был логическим продолжением. Но. наверное, и вправду незачем сейчас что-либо перелопачивать
    Запись от Evg размещена 04.07.2012 в 19:25 Evg на форуме
  12. Старый комментарий
    Аватар для fasked
    Несколько слов о чтении данных с консоли и языке Си
    Цитата:
    Сообщение от Evg Просмотреть комментарий
    http://www.cyberforum.ru/c-beginners/thread575050.html
    У человека проблема - ему нужно считать один символ. И такая постановка довольно-таки стандартная, в том смысле, что я часто видел, как люди об это спотыкаются. Неплохо бы добавить пример для решения этой проблемы.
    А смысл есть ли? Суть та же самая.

    Цитата:
    Сообщение от Evg Просмотреть комментарий
    И неплохо бы пронумеровать разделы, чтобы можно было людей отсылать на статью со словами типа "прочти раздел N3"
    Номера добавил.
    Запись от fasked размещена 04.07.2012 в 18:38 fasked вне форума
  13. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    http://www.cyberforum.ru/c-beginners/thread575050.html

    У человека проблема - ему нужно считать один символ. И такая постановка довольно-таки стандартная, в том смысле, что я часто видел, как люди об это спотыкаются. Неплохо бы добавить пример для решения этой проблемы.

    И неплохо бы пронумеровать разделы, чтобы можно было людей отсылать на статью со словами типа "прочти раздел N3"
    Запись от Evg размещена 22.06.2012 в 13:51 Evg на форуме
  14. Старый комментарий
    Аватар для fasked
    Несколько слов о чтении данных с консоли и языке Си
    Evg, пофиксил все, кроме ссылок и примеров. Добавлю чуть позже.
    Запись от fasked размещена 21.06.2012 в 19:11 fasked вне форума
  15. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    > А во-вторых, потому что реализовать полностью безопасный ввод на Си не совсем тривиальная задача

    Там тире должно быть

    > И все они используют так называемые потоки

    Думаю, лучше написать как "И все они используют так называемые потоки ввода-вывода (input-output stream)"

    > Существует два англоязычных термина: thread и stream

    Редиректор формуа косячит, а потому хз куда эти ссылки ведут

    > Логика функции scanf устроена весьма просто

    Если это новый абзац, то надо перевод строки воткнуть.

    > Когда происходит ошибка несоотвествия

    несоответствия

    > Если ввести "45abc", то scanf успешно прочтёт 45

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

    > Такой подход применяется в уже лишь чуть-чуть серьезных приложениях

    Шо такое "в уже лишь чуть-чуть"

    > Но она, в отличие от gets, помещает в буфер еще и символ перевода строки

    И в обязательном порядке завершает строку символом \0

    > Следует отметить, что если логика программы требует получения всей строки целиком

    Опять абзац

    > Пример безопасного чтения double

    Полезно было бы отобразить пример работы программы
    Запись от Evg размещена 06.06.2012 в 20:43 Evg на форуме
  16. Старый комментарий
    Запись от programina размещена 06.06.2012 в 20:04 programina вне форума
  17. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    В конце данного поста пример на тему "ради чего мы так геморроимся"
    http://www.cyberforum.ru/blogs/34326/blog279.html#comment1474
    Запись от Evg размещена 11.04.2012 в 16:58 Evg на форуме
  18. Старый комментарий
    Несколько слов о чтении данных с консоли и языке Си
    Для ознакомления
    [url]http://www.cyberforum.ru/blogs/34326/blog279.html#comment1451[/url]
    Запись от -=ЮрА=- размещена 10.04.2012 в 20:07 -=ЮрА=- вне форума
  19. Старый комментарий
    Аватар для Evg
    Несколько слов о чтении данных с консоли и языке Си
    Юра, ты всё-таки ради разнообразия вникай в то, что тебе пишут. Человек, условно говоря, показал код программы-калькулятора на несколько килобайт, а ты говоришь, зачем такая гора кода, когда я могу просто написать код в одну строку "int x = 10 + 20 * 30;" и незачем для этого писать кучу кода
    Запись от Evg размещена 08.04.2012 в 22:54 Evg на форуме
  20. Старый комментарий
    Несколько слов о чтении данных с консоли и языке Си
    [QUOTE]Enter double : aaaa
    Wrong input
    Wrong input[/QUOTE] - Ииии???
    Вывод прекратился или что???
    Enter double : dddsd
    Wrong input
    Wrong input
    Enter double :

    Да переставь условные операторы, не я это должен делать, я показал что можно обойтись без горы кода и на уровне "чукчи показал" как это сделать элегантно, остально лишь детали реализации...
    Запись от -=ЮрА=- размещена 08.04.2012 в 19:48 -=ЮрА=- вне форума
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru