Считывание пустой строки с консоли
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.12.15 18:30
Оценка: :)
Вот код для ввода данных с консоли:

printf("Введите номер шкалы времени: 0--ET, 1--ДМВ, 2--UTC (по умолчанию--1):\n");
scanf("%s",stsnumber);
if (strlen(stsnumber)>0)
tsnumber = atoi(stsnumber);
else
tsnumber = 0;

Когда я вводу 0 , 1 или 2 , то программа нормально считывает введённые значения и обрабатывает их.
Когда же я нажимаю на клавишу ввода Enter (Return), то у меня программа останавливается.

В чём дело? Как сделать так, чтобы я мог вводить как нужные мне числовые значение (0, 1 или 2), так и нажимать клавишу ввода, чтобы программа понимала это как ввод значения про умолчанию--то есть 1 ?
1613 г. = 2024 г.
Re: Считывание пустой строки с консоли
От: andrey82  
Дата: 29.12.15 06:17
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>В чём дело? Как сделать так, чтобы я мог вводить как нужные мне числовые значение (0, 1 или 2), так и нажимать клавишу ввода, чтобы программа понимала это как ввод значения про умолчанию--то есть 1 ?


Опуститься на уровень ниже? читать не строку а посимвольно через getchar()? Для Enter будет получено '\n'.
Re: Считывание пустой строки с консоли
От: Кодт Россия  
Дата: 29.12.15 14:42
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>scanf("%s",stsnumber);

RF>В чём дело?

Дело в том, что %s считывает не строку, а слово — непустую последовательность непробельных символов.
Программа не остановилась, а просто ждёт этого слова.
Если сто раз нажать <Enter>, а потом <1> <Enter>, то stsnumber получит "1".

Чтобы считать именно строку целиком до \n, есть функция gets().

Но эти сишные функции чреваты переполнением буфера.
Поэтому или пиши на Си со всей мыслимой тщательностью — scanf_s, gets_s и т.п., — или пиши на C++ — std::iostream.
Только оператор чтения, std::cin >> s — он тоже читает слово. Нужно использовать getline().

char buf[3];
gets_s(buf, 3); // прочитали не более 2 символов, включая \n, и добавили концевой \0

std::string buf;
std::getline(std::cin, buf); // прочитали сколько угодно символов, включая \n
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.