C: возвращение D в качестве выхода, почему? - PullRequest
1 голос
/ 17 апреля 2020
#include <stdio.h>

int main(){
    char *s="hello world";
    printf("%c\n",s);
}

Я написал небольшой код в C. В последнем утверждении этого кода я использую спецификатор формата %c в функции printf() и назначаю указатель с именем s. Это дает мне D в качестве выхода. Возвращает ли оно значение мусора или мой код автоматически присваивает ему значение ASCII или что-то еще?

Когда я добавляю s+1, он возвращает E и s+2, возвращает F и так далее. Кто-нибудь может уточнить меня?

Ответы [ 3 ]

7 голосов
/ 17 апреля 2020

%c печатает char, а не строку. Поскольку ваша переменная s не является char, а скорее указателем на char, printf интерпретирует адрес вашей строки как символ. Вы, вероятно, хотите использовать один из фрагментов:

printf("%c\n", s[0]); // print the first character in your string
printf("%s\n", s); // print the whole string
2 голосов
/ 18 апреля 2020

относительно:

printf("%c\n",s);

приводит к выводу компилятора:

*untitled2.c:5:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ *[-Wformat=]*   

При компиляции всегда включайте предупреждения, а затем исправляйте эти предупреждения. Рекомендуется:

printf("%s\n",s);

, поэтому оператор использует правильный спецификатор «преобразования выходного формата» для вывода всей строки

- ИЛИ -

для вывода одного символ предлагает:

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

для вывода только первого символа h

1 голос
/ 17 апреля 2020

Рассматривая, как вы делаете в этом коде, давайте просто скажем: да, вы получаете значения мусора, когда вы даете s / s+1 / s+2 ... in printf(). Это потому, что ваш спецификатор формата %c (тип char) не соответствует s (тип - строка). Исправьте это, изменив последнее на тип char, и ваши проблемы будут исправлены.

Вам не нужно беспокоиться о том, откуда приходит это значение, поскольку в конце дня это значение мусора. и будет разным для разных людей, использующих код. И я не вижу возможности использовать его.

Попробуйте следующий код ниже, и ваш код будет работать нормально:

    char *s="hello world";
    printf("%c\n",*s);

или

    char *s="hello world";
    printf("%c\n",s[0]);

Эти ответы обсуждаются в ответах и ​​комментариях выше. Но вы должны также попробуйте это,

    char s[]="hello world";
    printf("%c\n",s[0]);      

Потому что, хотя указатели присутствуют в C, swift, et c. Они не одобряются, потому что представляют серьезные проблемы для безопасности памяти и сбора мусора.


Редактировать: Stackoverflow fam нужно несколько голосов в текущем состоянии, я даже не могу комментировать. (Только если я прав)

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