Разве '\ 0' в середине строки может быть распознано как конец строки в C? - PullRequest
0 голосов
/ 24 января 2019

Я знаю, что в C '\0' всегда находится в конце строки, но всегда ли '\0' обозначает конец строки?

Так же, как «1230123» можно распознать как «123»?

В одном издании вопроса использовалось обозначение '/0' вместо '\0'.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Нулевой завершающий символ представлен как \0, а не /0, и он всегда обозначает конец строки, поскольку в C строки на самом деле являются одномерным массивом символов, оканчивающихся нулевым символом \0.

Это

char s[] = "1230123";

такой же, как этот

char s[] = {'1', '2', '3', '0', '1', '2', '3', '\0'};
                            |                    |
                    This is character '0'        |
                    whose decimal value is 48    |
                                                 |
                                     This is null terminating character
                                     whose decimal value is 0

Проверьте этот пример:

#include <stdio.h>

int main (void)
{
    int x,y,z;
    char s1[] = "1230123";
    char s2[] = {'1','2','3','\0','4','5','6','\0'};
    printf ("%s\n", s1);
    printf ("%s\n", s2);
    return 0;
}

Выход:

1230123
123      <======= The characters after null terminating character is not printed.
0 голосов
/ 24 января 2019

A строковый литерал может иметь '\0' в середине.

A string имеет только '\0' в конце.

'\0' - это символ _null_ и имеет значение 0. '0' - это ноль символа.
Смотрите значение '\ 0' такое же ... 0?


C имеет, как часть языка, строковые литералы .

Два строковых литерала ниже имеют размер 8: 7, которые вы видите, плюс 1 явно не закодированный трейлинг нулевой символ '\0'.

"abc-xyz"    // size 8
"abc\0xyz"   // size 8

C, как часть стандартной библиотеки, определяет строку .

A string - это непрерывная последовательность символов, оканчивающаяся и включающая первый нулевой символ.

Многие str...() функции работают только с данными вплоть до первого нулевого символа .

strlen("abc-xyz")  --> 7
strlen("abc\0xyz") --> 3
0 голосов
/ 24 января 2019

Байт со значением 0 по определению отмечает конец строки. Так что, если у вас было что-то вроде этого:

char s[] = { 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' };
printf("%s\n");

Это напечатало бы abc.

Это отличается от "1230123", где 4-й символ в строке - это не значение 0, а символ '0', который имеет код ASCII 48.

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