Можете объяснить данный фрагмент кода?Непонятно, почему используется такая запись printf("%s\n", "Error! Repeat input"); scanf_s("%*c", 0);

 int getDouble(double *a)
 {
 int n;
do{
   n = scanf_s("%lf", a, sizeof(double));
   if (n < 0) return 0;
   if (n == 0){ 
       printf("%s\n", "Error! Repeat input");
       scanf_s("%*c", 0);
              }
  } while (n == 0);
   

return 1;


Ответы (2 шт):

Автор решения: Elena_Gnil

printf("%s\n", "Error! Repeat input"); у вас будет выводить строку, указанную в аргументе. scanf_s("%*c", 0); будет требовать ввода данных типа char.

Вы можете узнать больше об этих функциях по этим ссылкам например:

  1. http://www.c-cpp.ru/content/scanf
  2. http://www.c-cpp.ru/content/printf
→ Ссылка
Автор решения: Stanislav Volodarskiy

printf("%s\n", "Error! Repeat input"); просто печатает сообщение. Можно ещё так: printf("Error! Repeat input\n");. Или так: printf("%s", "Error! Repeat input\n");.

scanf_s("%*c", 0); читает один символ из входного потока и никуда его не сохраняет. Полагаю что автор кода таким образом пропускает символ который испортил предыдущую попытку чтения числа.

Общий дизайн не самый лучший. Если вместо числа пользователь ввёл слово из нескольких букв будет напечатано несколько сообщений об ошибке:

word
Error! Repeat input
Error! Repeat input
Error! Repeat input
Error! Repeat input
12

Улучшить поведение можно поменяв "%*c" на "%*s". В случае ошибки будет пропущено целиком слово. Уже лучше. Если применить "%*[^\n]" то будет пропущена вся строка с ошибкой. Кажется, для пользователя это удобнее всего.

→ Ссылка