powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С] Подскажите, как считать из консоли строку с пробелами?
15 сообщений из 15, страница 1 из 1
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051401
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Появился у меня простой вопрос по С. Подумал, что С++ должны были про С хоть краем уха слышать, решил оставить эту тему здесь. Если я не прав, пожалуйста перенесите.

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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int foo()
{char line[256];
    scanf("%255s\n", line); // строка считалась до первого пробела
}

int foo()
{char line[256];
    fgets(line, 255, stdin); // отладчик выполнил эту строку, даже не передав управление консоли (ввод не состоялся)
}

int foo()
{char line[256];
    gets(line); // такой же результат, как и в предыдущем случае



Компилировал в студии 2010. Подскажите, как можно решить эту проблему иначе?
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051416
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшое наблюдение за кусочком кода:
Код: plaintext
1.
2.
3.
4.
while ( fgets(line, 79, stdin) != NULL)
{
	i = 0;
};



При прохождении сквозб условие цикла события развиваются следующим образом:
1) Управление передается в тело цикла без чтения информации с консоли, строка line содержит только null-терминатор
2) Упраление передается на условие цикла
3) Ввод с консоли
4) Управление передается в тело цикла. В строке то, что ввели с консоли.
5) Шаги №№2-4 повторяются, пока не поступит с клавиатуры символ Ctrl+Z

Подскажите, а почему первый вызов fgets не приводит к чтению информации с консоли?
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051459
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентос
Код: plaintext
1.
2.
3.
4.
int foo()
{char line[256];
    scanf("%255s\n", line); // строка считалась до первого пробела
}

Да, это описано в документации, читать надо внимательнее.
Если хочешь все символы включая пробельные, используй %c или %[] с перечислением допустимых символов.

Жентос
Код: plaintext
1.
2.
3.
4.
int foo()
{char line[256];
    fgets(line, 255, stdin); // отладчик выполнил эту строку, даже не передав управление консоли (ввод не состоялся)
}

Это проблема отладчика. Код верный и будет работать.

Жентос
Код: plaintext
1.
2.
3.
int foo()
{char line[256];
    gets(line); // такой же результат, как и в предыдущем случае

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

ЖентосКомпилировал в студии 2010. Подскажите, как можно решить эту проблему иначе?VS это один из самых дурных трансляторов. Скорее всего твои проблемы растут из-за неправильно поставленной галочки где-то в сотнях его диалогов настройки.
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051460
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосНебольшое наблюдение за кусочком кода:
...
При прохождении сквозб условие цикла события развиваются следующим образом:
То что у тебя код программы не соответствует выполняемому коду это проблема оптимизатора. Оптимизатор имеет право переставить строки программы местами если это улучшит производительность не повредив точности. В твоем случае похоже что оптимизатор превратил цикла while{} в do{}while(). А отладчику такие тонкости не по зубам, он работает на основе того что выдал компилятор, но по оригинальному тексту программы.
В общем, если хочешь увидеть "правильное" выполнение - отключи оптимизатор вообще.

А лучше всего, не используй отладчик, привыкай работать без него.
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051461
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентосотладчик выполнил эту строку, даже не передав управление консоли (ввод не состоялся)
Там что-то уже было (скорее всего, бесхозный 0x13).

Собственно, и fgets ровно для решения поставленной задачи придуман, и с помощью scanf-а тоже можно - изучите по нему мануал. Ибо просто %s - это таки до пробельного символа и задумано.
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051463
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>

int main()
{
	char s[256];
	
	fgets(s, 255, stdin);
	
	return 0;
}



Первый и единственный вызов работает. Работает в VC 2010 (и в любом другом). С дефолтными (и не очень) настройками проекта. Так что...
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051466
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое часто бывает, когда в отладчике запускаешь программу собранную в release.
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051485
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon , переместил fgets в начало кода, сработало как требуется с первой попытки. Возможно, в буфере клавиатуры есть какие-то еще символы, которые fgets считывает сразу же после вызова. Возникает вопрос: как проверить буфер на наличие в нем символа? В нем вполне могут быть символы, т.к. эта строка -- это уже второй ввод с клавиатуры по счету.

Код: plaintext
1.
2.
3.
4.
5.
6.
if ( scanf("%d", &degree)  == 1)
{
    printf("Enter coefficients of polynomial %s\n", caption);
    fgets(line, 255, stdin);    // в этом месте scanf-ы тоже не проходят. Считывают конец строки и передают управление дальше
...
}
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38051487
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. править свои сообщения нельзя, то напишу еще одно.
Проблему решил очисткой буфера ввода, после чтения scanf-ом

Код: plaintext
1.
fflush(stdin);



Всем спасибо
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38052518
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> То что у тебя код программы не соответствует выполняемому коду это проблема
> оптимизатора. Оптимизатор имеет право переставить строки программы местами если
> это улучшит производительность не повредив точности.

Кааакие фантазии...
А вот я думаю, что скорее всего автор пишет один код,
а отлаживает другой, как это часто бывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38052520
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> попытки. Возможно, в буфере клавиатуры есть какие-то еще символы, которые fgets
> считывает сразу же после вызова.

Фантазии.

Возникает вопрос: как проверить буфер на
> наличие в нем символа?

Никак. И не надо проверять, и нет никакого буфера клавиатуры
для С-шной программы, и в буфер никогда ничего лишнего не попадает.
ТО, тчо ты возможно видешь -- проблемы твоей интерпретации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38052560
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так где же истина. Я добавил флаши, и все заработало.

Ясмотрел, кстати, из чего состояли строки, которые вводились "сами". В них первым был символ "10"
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38052603
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application. The open status of the stream is unaffected.

У тебя просто видимо в строке для ввода после пробела есть еще какой -то мусор.
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38053836
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivFor input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application. The open status of the stream is unaffected.
У тебя просто видимо в строке для ввода после пробела есть еще какой -то мусор.
Это выглядело так: я нажал на кнопку "1", а потом на "ввод". А следующий ввод не работал, т.к. сканф.... кстати, я мог в шаблоне \n указать. Интересно, тогда пришлось бы буфер чистить или нет? Приду домой попробую
...
Рейтинг: 0 / 0
[С] Подскажите, как считать из консоли строку с пробелами?
    #38055071
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно, кстати, я сколько себя помню на С пишу, но очень мало использовал scanf.
Практически никогда.
Всегда либо вообще нет ввода-вывода,
либо читаешь из потока строками, потом разбираешь на поля.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С] Подскажите, как считать из консоли строку с пробелами?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]