Печать строки без дополнения 0 в конце - PullRequest
4 голосов
/ 25 июня 2019

Я пытаюсь напечатать строку "Hello" в двоичном формате.

Я заставляю его работать, но я бы хотел, чтобы он печатался без подкладки в конце

так

  01001000 01100101 01101100 01101100 01101111

вместо

  01001000 01100101 01101100 01101100 01101111 00000000

Вот мой код:

char t[] = "Hello";

for (int j = 0; j < sizeof(t); j++)
{
    unsigned char c = t[j];

    for (int i = 7; i >= 0; i--) {
        printf("%d", (c >> i) & 1 ? 1 : 0);
    }

    printf(" ");

}

Ответы [ 4 ]

8 голосов
/ 25 июня 2019

Вы можете изменить ваше условие цикла следующим образом:

for (int j = 0; t[j] != '\0'; j++)
/*              ^^^^^^^^^^^^     */

В настоящее время вы выполняете цикл для всех символов в t[], которые даже включают в себя завершающий символ nul.С измененным условием вы выходите из цикла, когда видите символ nul, отвечающий за конечные нули.

+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
  T   T   T   T   T   F   t[i] != '\0'

sizeof(t) = 6
strlen(t) = 5
3 голосов
/ 25 июня 2019

Или просто:

 for (int j = 0; j < (sizeof(t)-1); j++)

чтобы не печатать завершающий символ nul.

2 голосов
/ 25 июня 2019

По логике, вы должны просто сделать:

for (int j = 0; j < sizeof(t) - 1; j++)

Когда вы выполняете sizeof (t), нулевой символ в конце строки также считается и печатается.

Другое исправление будет:

for (int j = 0; t[j] != '\0'; j++)
0 голосов
/ 25 июня 2019

Это j < sizeof(t); вращает номер цикла символа плюс еще один (ноль символ) раз).Вместо этого вращайте цикл, пока \0 символ не появится.Например,

for (int j = 0; t[j]; j++) { }

Пример рабочего кода

char t[] = "Hello";
for (int j = 0; t[j] != '\0'; j++) /* using t[j]!='\0'  is much quicker than using strlen(t) */
{
    unsigned char c = t[j];
    for (int i = 7; i >= 0; i--) {
        printf("%d", (c >> i) & 1); /* No need to use ternary operator */
    }
    printf(" ");
}

Найдите хорошее прочтение о том, что не следует использовать strlen() в for условие цикла: Использует strlen () вусловие цикла медленнее, чем просто проверка на нулевой символ?

...