Консультация № 188437
16.12.2015, 10:29
0.00 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Среда разработки - VS 2012. Приложение пишется в консоли.

Не могу понять, почему не хочет считывать данные в переменную Buf при первом проходе.
Второй, третий проход - все нормально, а первый - просто пропускает.
Код в приложении.

С уважением, Максим

Приложение:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#define N 10
#define V 50
#define R 60
struct tabl
{
char resp[40];
float vr;
float kr;
};
int r;
int _tmain(int argc, _TCHAR* argv[])
{
struct tabl c[N];
struct tabl q;
char z;
int n;
char s1[40];
float otn_40;
float otn_min;
int n_min_otn;
int pr;
int p = 1;
char tabl[V + 1] = "--------------------------------------------------";
char rezu[R + 1] = "------------------------------------------------------------";
do
{
printf("Vvedite kolichestvo stran (ne bol`she %d): ",N);
scanf_s("%d", &n);
if (n < 0 || n > N){
pr = 1; printf("Vi oshiblis!\n");
}
else pr = 0;
}
while (pr);
printf("Vvedite danie o stranax\n");
printf("%s\n", tabl);
printf("!NN! Respublika ! Chislo vrachey ! Chislo krovatey !\n");
printf("%s\n", tabl);
char buf[10];
do {
for (int i = 1; i < n+1; i++)
{
printf("! %d ", i);
gets_s(buf);
printf("%s",buf);
}
} while (pr);
}

Обсуждение

давно
Посетитель
7438
7205
16.12.2015, 11:36
общий
это ответ
Здравствуйте, Максим!
Потоковый ввод - весьма коварная вещь.
После ввода количества стран остается код 0x0a.
Вроде как ничего нет, но что-то есть.
Вот первая gets_s и вылавливает ввод пустой строки.
В итоге buf[0] = 0
Побороть можно, например так:
Вместо:
Код:
gets_s(buf);
написать что-то типа:
Код:
do
{
gets_s(buf);
}while(buf[0]==0);
И тогда пустые строки будут отброшены...

5
Благодарю. Все работает.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
16.12.2015, 11:44
общий
Адресаты:
Маленькое уточнение:
После отработке scanf в потоке остается код 0x0a (а не 0x0d)

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399104
12
16.12.2015, 12:54
общий
Адресаты:
Благодарю. Проверил. Все работает.
Форма ответа