Использование функции putc - PullRequest
1 голос
/ 13 мая 2011

Я работаю над программой на C, которую я не написал, и интегрирую ее с моим кодом C ++. Эта программа на C имеет массив символов и функцию putc для печати ее содержимого. Как это:

printf("%c\n","01"[b[i]]);

Это битовый массив, который может иметь ASCII 0 или ASCII 1 (НЕ ASCII 48 и 49 ОБРАТИТЕ ВНИМАНИЕ). Эта команда печатает "0" и "1" отлично. Однако я не понял использование «01» в команде putc. Я также могу распечатать содержимое следующим образом:

    printf("%d\n",b[i]);

Поэтому мне было просто любопытно. Благодарю.

Новичок

Ответы [ 5 ]

4 голосов
/ 13 мая 2011

"01" является строковым литералом, который для всех намерений и целей является массивом. Это немного странно выглядит ... вы могли бы написать:

char *characters = "01";
printf("%c\n", characters[b[i]]);

или, может быть, даже лучше:

char *characters = "01";
int bit = b[i];
printf("%c\n", characters[bit]);

И это было бы немного легче понять на первый взгляд.

1 голос
/ 13 мая 2011

Строка "01" преобразуется в массив символов (то есть, какие строки в C), а b [i] задает либо 0, либо 1, так что его "разложенный" вид будет таким.

"01"[0]

или

"01"[1]

Что бы выбрать "правильный" символ из строки "char" массива.Обратите внимание, что это возможно только из-за определения, что строка является указателем на символ.Таким образом, операция [...] становится операцией смещения памяти, равной размеру одного элемента типа указателя (в данном случае, одного символа).

Да, ваш printf был бы намного лучше,поскольку это требует меньше знаний о неясных уловках "с".

1 голос
/ 13 мая 2011

Гадкий способ выполнения работы, но тот, кто написал это, использовал содержимое b как разыменование массива в строку, "01":

"foo"[0] <= 'f'
"bar"[2] <= 'r'
"01"[0] <= '0'
"01"[1] <= '1'

ваш массив b содержит 0 и 1и автору нужен был способ быстро превратить их в «0» и «1».Он мог бы так же легко сделать:

'0' + b[i]

Но это еще одно преступное поведение.=]

0 голосов
/ 13 мая 2011

Сделайте ли вы заявление, которое вы понимаете.

Упрощая другое, заменив b[i] на индекс, мы получим

"01"[index]

Строковый литерал ("01") имеет типchar[3].Получение его индекса 0 или 1 (или 2) в порядке и возвращает символ '0' или '1' (или '\0').

0 голосов
/ 13 мая 2011

В этой строке написано, взять массив символов "01" и ссылаться на элемент массива. Получить этот индекс из местоположения b [i].

Таким образом "01"[0] возвращает символ 0, а "01"[1] возвращает символ 1

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