Почему первый вход get () теряется в этой программе c?

В следующем простом коде ввод первых получателей не отображается. Любая помощь, пожалуйста?

int main()
{
    int x;
    char tmp[1];
    char anystr[10], srchstr[1];

    printf("Enter an string : ");
    gets(anystr);

    printf("Enter any character you want to search in input string: ");
    gets(srchstr);

    printf("anystr : %s\n",anystr);
    printf("anystr : %c\n",anystr[0]);
    printf("srchstr : %c\n",srchstr[0]);

    return 0;
}

Вывод равен нулю для первой строки fgets anystr:

Enter an string : hello
Enter any character you want to search in input string: h
anystr : 
anystr : 
srchstr : h

2 ответа

Решение

У вас есть проблема, потому что у вас есть неопределенное поведение.
UB вызвано наличием второго gets() записать за 1-символьный массив srchstr, То, что написано за пределами является терминатором '\0',
Увидеть gets() document: http://en.cppreference.com/w/c/io/gets

Ни один ответ на этот вопрос не следует упоминать (используя симпатичную ссылку Джонатана Леффлера):
Почему функция get так опасна, что ее нельзя использовать?

Вот и все. UB и опасно. Готово. Конец ответа.

Что ж....
Одно предположение о том, какой конкретный носовой демон летает вокруг, было бы:
strchr расположен прямо перед anystr, Это означает, что тот, у кого нет доступа, попадает прямо в первый символ внутри anystr,
Т.е. он заканчивает эту другую строку сразу после нуля символов.
Т.е. это делает его пустым.
Печать его для этого не имеет выхода, хотя второй символ все еще из ранее написанной строки.

Не использовать gets() как указано здесь man 3 fges

Никогда не используйте gets(). Поскольку невозможно заранее знать, не зная данных, сколько символов будет читать (), и поскольку функция get () будет продолжать хранить символы после конца буфера, использовать его крайне опасно. Он был использован для взлома компьютерной безопасности. Вместо этого используйте fgets().

использование fgets() лайк

fgets(anystr,sizeof(anystr),stdin);

Также char srchstr[1]; должно быть char srchstr; как вы спрашиваете в printf Введите любой символ, который вы хотите найти в строке ввода:

И сканировать srchstr использование scanf(" %c",&srchstr);

вы можете захотеть что-то вроде

int main(void ) {
        char anystr[10],srchstr;
        printf("Enter an string : ");
        fgets(anystr,sizeof(anystr),stdin);/*use fgets instead of gets */

        printf("Enter any character you want to search in input string: ");
        scanf(" %c",&srchstr);/* give the space before %c to avoid buffering problem */

        printf("anystr : %s\n",anystr);
        printf("anystr : %c\n",anystr[0]);
        printf("srchstr : %c\n",srchstr);

        return 0;
}
Другие вопросы по тегам