Проблема с scan_s (), printl_s () и char в C с Visual Stuido - PullRequest
0 голосов
/ 17 мая 2019

В Visual studio 2017 у меня проблема с scan_s(), printl_s() и char для кодирования простого приложения ввода и вывода. Пожалуйста, просмотрите 2 приложения и помогите объяснить, помогите мне в чем проблема, когда я использовал scan_s(), printl_s() и char.

Этот код в порядке:

#include <stdio.h>
int main() {
    char name[30];
    printf("Enter name: ");
    gets(name); // enter string
    printf("Name: ");
    puts(name); // display string
    _getch();
}

Enter name: Dung_cute
Name: Dung_cute

Это неправильно:

#include <stdio.h>
int main() {
    char name[20];
    printf_s("Enter name: ");
    scanf_s("%c", name); // enter string
    printf("Your name is: %s.", name);
    _getch();
}

Enter name: Dung_cute
Your name is: D?????aietnauie'ai.

Ответы [ 2 ]

4 голосов
/ 17 мая 2019

scanf_s требует от вас также указать количество байтов для чтения.По умолчанию он читает только один.

Пожалуйста, найдите здесь дополнительную информацию.

Пример (по ссылке выше):

result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                 &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );

Следовательно,

scanf_s должен выглядеть примерно так:

scanf_s("%c", name, _countof(name));

Возможно, вам также потребуется изменить спецификатор типа на "% s".У меня нет Visual Studio под рукой для тестирования.

scanf_s("%s", name, _countof(name));
          ^
0 голосов
/ 17 мая 2019

Какой бы ресурс вы ни изучали, немедленно прекратите его.

Программирование на C опасно, и любой ресурс, который рекомендует функцию gets, не соответствует задаче. Если вы продолжите использовать этот ресурс для обучения, вы будете писать код, который постоянно падает и будет иметь уязвимости, такие как переполнение буфера.

...