я не могу правильно воспринимать информацию от пользователя - PullRequest
0 голосов
/ 20 мая 2019

я раньше работал с scanf (); но визуальная студия говорит мне, что это не безопасно, когда я использую fgets (); он вводит только первые два входа, а третий игнорируется

void main() {

    char c=' ';
    char s[20];
    char sen[40];
    fgets(&c, sizeof(c), stdin);
    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);

    system("pause");

}

здесь он реализует первые два, а третий fgets полностью игнорируется ЗАЧЕМ?? и каковы хорошие приемы ввода данных от пользователя в c?

1 Ответ

2 голосов
/ 20 мая 2019

fgets будет хранить нулевой терминатор вместе с возвратом каретки внутри буфера. Поэтому вы должны убедиться, что буфер достаточно большой, чтобы хранить ваши данные + нулевой терминатор + возврат каретки. Если вы берете один символ, например c, то это должен быть массив размером 3. Символ + 0 + \ n Это также хорошая практика, чтобы обнулить ваши массивы.

#include <stdio.h>
int main() {

    char c[3] = {0};
    char s[20] = {0};
    char sen[40] = {0};
    fgets(c, sizeof(c), stdin);
    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);
    return 0;
}

И используйте int main вместо void main.

Если вы хотите использовать односимвольный ввод в fgets, вы можете очистить поток ввода самостоятельно, читая, пока возврат каретки не будет извлечен из потока.

#include <stdio.h>
int main() {

    char c;
    char s[20] = {0};
    char sen[40] = {0};
    fgets(&c, sizeof(c), stdin);

    while(getchar() != '\n'); //read until carriage return

    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);
    return 0;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...