Почему мой вывод неверен?С новичком - PullRequest
0 голосов
/ 06 июня 2018
#include <stdio.h>
int main(void) 
{
    char username;
    username = '10A';
    printf("%c\n", username);
    return 0;
}

Я только начал изучать C, и вот моя первая проблема.Почему эта программа выдает мне 2 предупреждения (многосимвольная константа, переполнение при неявном преобразовании констант)?

И вместо того, чтобы выдавать 10A в качестве вывода, она выдает только A.

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Вы можете использовать char *username, чтобы указывать на начало адреса и циклически перемещаться по памяти после.Например, используйте sizeof(username), чтобы получить размер, а затем зацикливайте printf, пока вы не напечатаете количество символов в имени пользователя.Однако вы можете столкнуться с серьезными проблемами, если не будете осторожны ...

0 голосов
/ 06 июня 2018

'10A' - это разрешенный, но неясный способ определения значения.

В случае переменной int,

int username = '10A';
printf("%x\n", username);

выведет

313041

Это пары шестнадцатеричных значений - каждая пара

0x31 - это '1' вашего ввода.

0x30 - это '0' вашего ввода.

0x41 - это 'A' вашего ввода.

Но тип char не может удержать это.

0 голосов
/ 06 июня 2018

В Си нет строковых объектов.Вместо этого строки представляют собой массивы символов (за которыми следует нулевой символ).Другие ответы указывают на статическое распределение этой памяти.Однако я рекомендую динамически размещать строки.Просто помните, что в C отсутствует сборщик мусорной памяти (как в java).Так что не забудьте освободить свои указатели.Веселись !!

0 голосов
/ 06 июня 2018

Вы пытаетесь объединить несколько символов в один набор '' и в одну переменную char.Вам нужно "" для строковых литералов, и вам понадобится массив символов для хранения строки.И чтобы напечатать строку, используйте %s.

Собрав все это вместе, вы получите:

#include <stdio.h>
int main(void) 
{
    char username[] = "10A";
    printf("%s\n", username);
    return 0;
}

Сноска

От ДжонатанаЛеффлер в комментариях ниже относительно многосимвольных констант:

Обратите внимание, что многосимвольные константы являются частью C (следовательно, предупреждение, а не ошибка), но значение многосимвольной константыопределяется реализацией и, следовательно, не является переносимым.Это целочисленное значение;он больше, чем умещается на символе, так что вы получите это предупреждение.Вы могли бы получить почти все что угодно - выходные данные 1, A и нулевой байт могли бы быть правдоподобными.

...