Как заставить функцию 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]" - означает записывать в строку все символы кроме переноса строки. Знаки переноса строки не будут записаны. А пробелы будут.

→ Ссылка