Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С] Подскажите, как считать из консоли строку с пробелами? / 15 сообщений из 15, страница 1 из 1
23.11.2012, 23:17
    #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
23.11.2012, 23:52
    #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
24.11.2012, 02:29
    #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
24.11.2012, 02:37
    #38051460
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С] Подскажите, как считать из консоли строку с пробелами?
ЖентосНебольшое наблюдение за кусочком кода:
...
При прохождении сквозб условие цикла события развиваются следующим образом:
То что у тебя код программы не соответствует выполняемому коду это проблема оптимизатора. Оптимизатор имеет право переставить строки программы местами если это улучшит производительность не повредив точности. В твоем случае похоже что оптимизатор превратил цикла while{} в do{}while(). А отладчику такие тонкости не по зубам, он работает на основе того что выдал компилятор, но по оригинальному тексту программы.
В общем, если хочешь увидеть "правильное" выполнение - отключи оптимизатор вообще.

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

Собственно, и fgets ровно для решения поставленной задачи придуман, и с помощью scanf-а тоже можно - изучите по нему мануал. Ибо просто %s - это таки до пробельного символа и задумано.
...
Рейтинг: 0 / 0
24.11.2012, 02:53
    #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
24.11.2012, 03:02
    #38051466
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С] Подскажите, как считать из консоли строку с пробелами?
Такое часто бывает, когда в отладчике запускаешь программу собранную в release.
...
Рейтинг: 0 / 0
24.11.2012, 07:43
    #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
24.11.2012, 08:02
    #38051487
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С] Подскажите, как считать из консоли строку с пробелами?
Т.к. править свои сообщения нельзя, то напишу еще одно.
Проблему решил очисткой буфера ввода, после чтения scanf-ом

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



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

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

Фантазии.

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

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

Ясмотрел, кстати, из чего состояли строки, которые вводились "сами". В них первым был символ "10"
...
Рейтинг: 0 / 0
26.11.2012, 07:20
    #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
26.11.2012, 18:57
    #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
27.11.2012, 16:16
    #38055071
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С] Подскажите, как считать из консоли строку с пробелами?
Прикольно, кстати, я сколько себя помню на С пишу, но очень мало использовал scanf.
Практически никогда.
Всегда либо вообще нет ввода-вывода,
либо читаешь из потока строками, потом разбираешь на поля.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С] Подскажите, как считать из консоли строку с пробелами? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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