Как заставить функцию scanf_s считать всю строку на русском (!) до знака перевода строки (т.е. все символы и пробелы)?
Возникли две проблемы. Во-первых, scanf_s не может считать в буфер русские символы.
Во-вторых,
printf("\nВведите фамилию и инициалы: ");
scanf_s("%s", buff, (unsigned)_countof(buff));
просит ввод фамилии и инициалов, между которыми должен быть пробел. Но scanf_s считает строку только до пробела. Много гуглил, но так и не смог найти решение!
#include <iostream>
#include <stdio.h>
#include <string>
#include <locale.h>
using namespace std;
struct Student {
string NAME;
int GROUP;
int SES[5];
};
int main()
{
setlocale(LC_ALL, "Russian");
const int n = 10;
char buff[255];
Student STUD1[n];
for (int i = 0; i < n; i++)
{
printf("----------------------------------------\n");
printf("Введите данные для %i-го студента:\n", i + 1);
printf("\nВведите фамилию и инициалы: ");
scanf_s("%s", buff, (unsigned)_countof(buff));
STUD1[i].NAME = string(buff);
printf("\nВведите номер группы : ");
scanf_s("%d", &STUD1[i].GROUP);
printf("\nВведите успеваемость студента: ");
scanf_s("%d%d%d%d%d", &STUD1[i].SES[0], &STUD1[i].SES[1], &STUD1[i].SES[2], &STUD1[i].SES[3], &STUD1[i].SES[4]);
}
printf("----------------------------------------\n");
bool key;
for (int i = 0; i < n; i++)
{
key = true;
for (int x = 0; x < 5; x++)
{
if (STUD1[i].SES[x] < 4) key = false;
}
if (key) {
strcpy_s(buff, STUD1[i].NAME.c_str());
printf("Студент %s, группа %i", buff, STUD1[i].GROUP);
printf("\n");
}
}
}
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Знак "%255s" в функции scanf означает читать строку до пробела или до разрешённого количества букв 255. А это значит оно будет читать одно слово.
Есть в функции scanf возможность читать строку до определённых символов.
# include <stdio.h>
int main ( ) {
char str [ 0x100 ] ;
int n = scanf ( "%255[^\n\r]" , & ( str [ 0 ] ) ) ;
printf ( "n = %d\n" , n ) ;
printf ( "str = \"%s\"\n" , & ( str [ 0 ] ) ) ;
}
"%255[^\n\r]" - означает записывать в строку все символы кроме переноса строки. Знаки переноса строки не будут записаны. А пробелы будут.
