scanf и printf не печатают правильные значения - PullRequest
0 голосов
/ 02 октября 2019

Что здесь происходит? Код выглядит следующим образом:

#include<stdio.h>
#include<string.h>

int main()
{
    char name[15];
    char name_[15];
    char answ[1];

    printf("What's your name?\n");
    scanf("%s", name);

    strcpy(name_, name);

    printf("Yes / No: ");
    scanf("%s", answ);

    printf("Hello! %s\n", name_);
    printf("You said: %s\n", answ);

    return 0;
}

При вводе «name» и «yes» ожидаемый вывод будет следующим:

Hello! имя

Вы сказали: да

Вместо этого я получаю:

Привет! es

Вы сказали: да

Я также пытался добавить пробелы перед% s безрезультатно.

Так что же мне здесь не хватает?

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

answ может содержать только 1 символ. Поэтому в настоящее время дополнительный символ "es" + '\0' записывается в память, присвоенную name_. Итак, "es" печатается.

1 голос
/ 02 октября 2019

Вы создали классический уязвимый переполнение буфера, но в вашем коде. Вот почему большинство современных компиляторов советуют вам менять sscanf на sscanf_s или аналогичный. Как указывали другие люди, вы перезаписываете следующую переменную в стеке.

Я хотел бы дать этот ответ, чтобы сказать: никогда не используйте sscanf или любую из устаревших небезопасных функций Си. Даже если это, вероятно, просто игрушечный пример, попрактикуйтесь в написании современного C-кода. От этого вы выиграете в долгосрочной перспективе.

1 голос
/ 02 октября 2019

Вы выделили место только для односимвольного ответа да / нет, но пишете в него больше символов.

Это приводит к неопределенному поведению .

Вам нужно выделить больше места для answ, не забывая о терминаторе NUL.

...