Печать массива символов с нулевым символом посередине в C - PullRequest
0 голосов
/ 05 сентября 2018

Я заметил, что когда вы пытаетесь напечатать нулевой символ в C, ничего не будет напечатано.

printf("trying to print null\n");
printf("%c", '\0');

Однако я пытаюсь распечатать символы в следующем массиве один за другим, вплоть до шестого символа, который является нулевым символом.

char s[] = "Hello\0Bye";
int i;
for(i = 0; i < 7; i++) {
    printf("%c", s[i]);
}
printf("\n");

Я ожидал, что «Hello» будет напечатано, так как шестой символ равен нулю, ничего не будет напечатано. Однако мой вывод был: «HelloB». Кажется, что printf пропустил нулевой символ и просто перешел к следующему символу. Я не уверен, почему вывод «HelloB» вместо «Hello».

Любые идеи будут очень признательны.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

int i; for(i=0; i<7; i++) генерирует 7, а не 6 итераций. Печать \0 не генерирует пикселей на консоли (символ 6), а затем седьмой символ (следует B).

0 голосов
/ 05 сентября 2018

Конструкция '\0' обычно используется для представления нулевого символа. Здесь

printf("%c", '\0');

ничего не печатает.

А в декаларации s

char s[] = "Hello\0Bye"; 

когда вы печатаете как

for(i = 0; i < 7; i++) {
    printf("%c", s[i]); 
}

printf() печатает до 0<7(h), 1<7(e) .. 5<7(nothing on console), 6<7(B) только итераций и 6th charactar равен B, следовательно, его отпечатки HelloB.

Я ожидал, что будет напечатано «Hello»? Для этого вы должны вращать цикл до тех пор, пока не встретится \0. Например, 1027 *

for(i = 0; s[i] != '\0'; i++) { /* rotate upto \0 not 7 or random no of times */ 
   printf("%c", s[i]); 
}

Или даже вам не нужно проверять s[i] != '\0'

for(i = 0; s[i]; i++) { /* loop terminates automatically when \0 encounters */ 
     printf("%c", s[i]); 
}
0 голосов
/ 05 сентября 2018

Вы можете использовать ниже два варианта
1. size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
2. Проанализируйте каждый символ и напечатайте его.

...