Неожиданный вывод в этой программе - PullRequest
2 голосов
/ 30 марта 2011
#include<stdio.h>
int main()
{
    char arr[20];
    printf("\nEnter your name: ");
    gets(arr);
    printf(arr);
}

Ввод: %d%s%u

Выход: 0<null>-056716812[

Почему вывод такой?

Ответы [ 5 ]

4 голосов
/ 30 марта 2011

Возможно, вы еще не сталкивались с форматированным выводом.printf() принимает строку в качестве первого параметра, а затем переменное число дополнительных параметров.Специальные строки, найденные в первых параметрах, заменяются значениями, указанными в дополнительных параметрах.Например:

int i = 42;
printf("%d", i);

выводит 42.

Или вы можете написать:

char name[] = "The Devil";
int num = 666;
printf("My name is %s and my favourite number is %d.", name, num);

Ну, вы можете представить, что происходит.

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

printf("%d%s%u");

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

3 голосов
/ 30 марта 2011

printf записывает вывод под управлением format string, который указывает, как последующие аргументы (или аргументы, доступ к которым осуществляется через аргумент переменной длины), преобразуются для вывода.

Если количество аргументов, предоставленных в вызове printf, меньше количества спецификаторов преобразования, то поведение не определено.

Так должен быть сделан звонок, printf("%s",arr).

Кстати, есть кое-что еще более смешное, что вы можете попробовать, - printf(arr,20,arr,20) - замените его и посмотрите забавное, но убедитесь, что ввод остается тем же, что вы дали, то есть %d%s%u

1 голос
/ 30 марта 2011

gets не является безопасным. Он не проверяет переполнения буфера. Вместо этого используйте fgets.

fgets(arr,sizeof(arr),stdin) ;

И печать -

printf("%s", arr) ;
0 голосов
/ 30 марта 2011

Кажется, вы хотели использовать аналог gets, то есть puts:

puts(arr);
0 голосов
/ 30 марта 2011

Это не способ использовать printf, вы должны сделать printf("%s", arr);, чтобы напечатать строку из места, указанного arr.То, как вы это называли, на самом деле называлось printf("%d%s%u");, что давало вам мусор, зависит от соглашения о вызовах, вы получите разные результаты.в случае cdecl он напечатает следующий элемент в стеке как int, затем строку, указанную следующим элементом, а затем следующий элемент как беззнаковое целое.

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