Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество символов в потоке 
:(
    Опции темы
Compositum
Дата 10.5.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Код на С
Код

//Раздел 1.5.2 из Ритчи (модифицированный мною вариант)
#include<stdio.h>

main()
{
    int chc = 0;
    int c;
    printf ("Символ\tКод\n");

    while ((c = getchar()) != EOF)
    {
        printf ("%c\t%3d\n", c, c);
        ++chc;
    }
    printf ("Количество символов: %d\n", chc);
}

Читаю строку из текстового файла, содержимое которого такое:
01234
В конце строки я не нажимаю Enter и не могу перейти на вторую строку стрелкой на клавиатуре. Ожидаю, что мой код выдаст количество символов равным 5. Однако получаю такой результат:

user posted image

Т.е. не зависимо от того, что я не нажимал Enter символ \n все равно был добавлен текстовым редактором к моей строке? Ещё не понял такого момента: символ \n представлен двумя байтами (иначе как объяснить, наличие пустой строки в выводе на скрине)? Для того, чтобы представить число 10, хватит и одного байта... Чего-то я не понял...

PM   Вверх
bsa
Дата 10.5.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



во-первых, какой именно редактор ты используешь? Vim, действительно, не позволяет сделать файл без пустой последней строки. С nano я так толком в этом вопросе не разобрался. На мой взгляд, самый адекватный консольный редактор - mcedit (Midnight Commander).
во-вторых, так как ты выводишь не только код символа, но и сам символ, то и происходит переход на новую строку. попробуй в printf заключить %c в апострофы.
PM   Вверх
volatile
Дата 11.5.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(bsa @  10.5.2011,  23:01 Найти цитируемый пост)
попробуй в printf заключить %c в апострофы

а лучше так
Код

printf ("%c\t%3d\n", isprint(c)?c:'?', c);

вместо непечатных символов будут выводиться символы вопроса.

PM MAIL   Вверх
Compositum
Дата 11.5.2011, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(bsa @ 10.5.2011,  23:01)
во-первых, какой именно редактор ты используешь? Vim, действительно, не позволяет сделать файл без пустой последней строки. С nano я так толком в этом вопросе не разобрался. На мой взгляд, самый адекватный консольный редактор - mcedit (Midnight Commander).
во-вторых, так как ты выводишь не только код символа, но и сам символ, то и происходит переход на новую строку. попробуй в printf заключить %c в апострофы.

В Ubuntu 11.04 текстовым редактором по умолчанию установлен gedit - в нём и пишу код. Ну хорошо, пусть текстовый редактор добавляет в конце '\n', но почему в выводе перед этим символом у меня присутствует пустая строка (без символа и без его числового значения)? Если бы это был некий непечатаемый символ - тогда хотя бы числовое значение присутствовало, а тут - даже этого нет... ???
Цитата(volatile)

а лучше так
Код

printf ("%c\t%3d\n", isprint(c)?c:'?', c);

вместо непечатных символов будут выводиться символы вопроса.

Попробовал, теперь результат выглядит так, как я и ожидал вначале:

user posted image

Т.е. несмотря на то, что символ '\n' имеет код 10, который представляется одним байтом, тем не менее указанный символ кодируется двумя байтами? Я верно понимаю (иначе как объяснить наличие пустой строки, показанной мною на скрине в первом посте топика и его отсутствие на втором, когда непечатаемый символ отображаем как '?')?



Это сообщение отредактировал(а) Compositum - 11.5.2011, 06:44
PM   Вверх
xvr
Дата 11.5.2011, 11:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Compositum @  11.5.2011,  06:26 Найти цитируемый пост)
тем не менее указанный символ кодируется двумя байтами?

Нет.

Цитата(Compositum @  11.5.2011,  06:26 Найти цитируемый пост)
иначе как объяснить наличие пустой строки, показанной мною на скрине в первом посте топика и его отсутствие на втором, когда непечатаемый символ отображаем как '?'

Вывод символа с кодом 10 ('\n') в консоль вызывает перевод строки. Именно этот перевод строки вы и видели в первом посте

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.