Нулевой символ и строки в C - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующий код C:

#include <stdio.h>
#include <strings.h>

int main(void){

char * str = "\012\0345";

char testArr[8] = {'\0','1','2','\0','3','4','5','\0'};

printf("%s\n",str);

printf("**%s**",testArr);

return 0;
}

См. Живой код здесь

У меня проблемы с пониманием результатов, и я погуглил, но не уверенчто я понимаю, почему нулевой символ в начале строки и почему один в середине будет вызывать отображение только строки «5».Кроме того, когда я назначаю каждый символ строки массиву testArr, а затем пытаюсь отобразить этот массив символов, результат отличается, несмотря на то, что строка и массив имеют одинаковые символы.Итак, я поражен неутешительными результатами, особенно их несоответствием.Со строкой str код отображает «5», потому что нулевые символы перезаписывают то, что находится в памяти?

Кроме того, в массиве, который я создал с использованием тех же символов, ничто не отображает данные, содержащиеся в массиве testArr.Является ли это тем, что, как только по какой-то причине встречается первый нуль, все остальное игнорируется?Если да, то почему такое же поведение не происходит со строкой str, которая содержит одинаковые символы?

1 Ответ

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

В восьмеричной escape-последовательности \, за которой следуют от одной до трех восьмеричных цифр, согласно C 2018 6.4.4.4 1. Согласно 6.4.4.4 7: «Каждая восьмеричная или шестнадцатеричная escape-последовательность является самой длинной последовательностью символов, которая может составлятьescape-последовательность ». Таким образом, когда компилятор видит "\012\0345", он интерпретирует его как последовательность \012 (равную десяти), последовательность \034 (равную двадцати восьми) и символ 5.

Чтобы представить строку, которую вы намеревались, вы можете использовать "\00012\000345".Поскольку восьмеричная escape-последовательность заканчивается тремя цифрами, это интерпретируется как последовательность \000, символы 1 и 2, последовательность \000 и символы 3, 4 и 5.(Нулевой завершающий символ также будет добавлен автоматически.)

Когда вы печатаете "\012\0345", символы с кодами десять и двадцать восемь были напечатаны, но не имели видимого эффекта.(Ваша реализация C, вероятно, использует ASCII, в этом случае они являются управляющими символами. \012 - это новая строка, поэтому она должна была вызвать перенос строки, но вы, вероятно, не заметили, что. \034 - это элемент управления разделителем файловсимвол, который, вероятно, не действует при печати на обычном терминальном дисплее.)

Когда вы печатаете testArr, нулевой символ в первой позиции заканчивает строку.

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