Основной вопрос указателя C - PullRequest
4 голосов
/ 01 сентября 2010

Я сейчас читаю книгу «Изучите С» и натолкнулся на вопрос, которого я действительно не понимаю. Задача упражнения - найти проблему с помощью этого кода:

char c;

c = 'a';

printf("c holds the character %c.",c);

.. а затем он дает объяснение, что: «Текстовая строка« a »состоит из двух символов, и« a », и завершающего нулевого байта. Переменная c имеет размер только один байт. Даже если c Если длина была 2 байта, вы не можете скопировать текстовую строку таким образом. Попробуйте скопировать текст по одному байту за раз в переменную, достаточно большую, чтобы содержать текстовую строку и ее завершающий нулевой байт. "

Однако, когда я запускаю приведенный выше код - он прекрасно работает. Мне показалось, что я понял теорию, объясняющую, почему это плохо - все завершается 0 в конце строки, поэтому я переписал код, подобный этому, чтобы проверить:

char c[2];

*c = 'a';

printf("c holds the character %c.",c);

Но это порождает проблему. Я начинаю путаться в отношении проблемы. Разве этот 2-й набор кода не передаст букву «a» указателю в c [0], а затем поместит завершающий 0 в c [1] - полностью используя 2 пробела, выделенных для этого массива?

Ответы [ 9 ]

9 голосов
/ 01 сентября 2010

Объяснение того, что: "Текстовая строка" a "состоит из двух символов, обоих 'a' и завершающего нулевого байта.

Это правда, но 'a' не "a". 'a' это один символ. Так что 'a' очень хорошо вписывается в char.

Пример записи одного символа по одному в строку должен выглядеть следующим образом:

char str[2];
str[0] = 'a';
str[1] = 0; /* because nothing guarantees array items are initialized to 0 */
printf("str holds the string %s.", str);
8 голосов
/ 01 сентября 2010

Текст неправильный, иначе вы расшифровываете код неправильно.

В Си строка в двойных кавычках заканчивается нулем.Символ в одинарных кавычках - это всего лишь один символ.

2 голосов
/ 01 сентября 2010

Во втором примере кода, c интерпретируется как указатель на первый элемент в массиве (т.е. как char *), а не как char. Вы можете сделать:

printf("c holds the character %c.", *c);

или

printf("c holds the character %c.", c[0]);

или

printf("c holds the character %s.", c);

В последнем примере %s указывает printf() ожидать строку, а не символ. Однако в этом случае вы должны установить второй элемент c[] как «нулевой терминатор» (используя, например, c[1] = '\0'), в противном случае printf() не будет знать, где заканчивается строка, и потенциально выведет бесконечное число количество мусора.

2 голосов
/ 01 сентября 2010

В C одинарные кавычки означают символьную константу.

1 голос
/ 01 сентября 2010

Строки в C на самом деле являются символьными массивами.So char c [2];является объявлением для c, который является массивом символов с 2 элементами.Назначать его с «a» неправильно, поскольку это символьный литерал, вы должны назначить его с «a», который является строковым литералом.Просто запомните разницу между одинарными и двойными кавычками, как указано в предыдущих комментариях.

0 голосов
/ 28 февраля 2018

При программировании на C символ в одинарных кавычках: 'a' и символ в двойных кавычках: 'a' имеют различные значения.

Помещая один символ в одинарные кавычки, вы указываете, что выхотите, чтобы 'a' интерпретировалось как один отдельный символ, поэтому завершающий нулевой байт не добавляется.

Если вы поместите свой символ в двойные кавычки, то он будет объявлен как строка.В этом случае завершающий нулевой байт автоматически соединяется до конца, и вам не о чем беспокоиться.В результате получается следующая строка:

"a/0"

Если вы хотите инициализировать переменную str в строке «a», используя только одинарные кавычки, вам придется явно добавить завершающий символНулевой байт в.

char str[2];
str[0] = 'a';
str[1] = '/0';
printf("str holds the string %s.", str);

В противном случае вы можете просто инициализировать первый индекс строки в «a», используя двойные кавычки, и завершающий нулевой байт будет автоматически добавлен во второй индекс.

char str[2];
str[0] = "a";
0 голосов
/ 06 апреля 2011

В C одинарные кавычки описывают один символ, то есть «a» в то время как в двойных кавычках "а" он составляет пустую строку

Итак, это

int main(void)
{
    char s[2]="a";

    // s='a'; leads to error incompatible types.........
    printf("%s",s);

    return 0;
}

будет работать нормально

0 голосов
/ 01 сентября 2010

Что-то не так с объяснением, показанным в книге. «А» - это одиночный символ (обратите внимание на одинарные кавычки), а «а» - строка. Теперь «а» действительно 0x00 прекращается. Но «а» не так.

На данный момент я пришел к выводу, что либо что-то искажено, когда вы скопировали информацию из книги ... или ... цель "Изучить С" была целью автора книги.

0 голосов
/ 01 сентября 2010

В C 'c' - это один символ, тогда как "c" - это строка символов.(Обратите внимание на двойные кавычки).Объяснение автора книги о переменной, занимающей 2 байта, соответствует только второму случаю.

В вашем первом сегменте кода вы назначаете совершенно корректный 1-байтовый символ переменной переменной и печатаете его.Так что это работает.

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

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