Определение строк и когда добавлять '\0'

Определены шесть форм строк:

①、 char *arr="привет, мир"; 

  Обоснование: значение строковой константы по сути является адресом первого символа.

②、 char *arr;arr="hello world"; 

  Переписывание ①.

③、 char arr[]="привет";

  Для хранения строки используется массив символов.Реальная длина строки в памяти составляет 6 символов, включая '\0'.

  1 printf("%d\n",strlen(arr));//5, длина, вычисляемая функцией strlen, не включает '\0', и расчет заканчивается на первом '\0', например, для строки "abc \0def", результат вычисления strlen равен 3
  2 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//6, длина, вычисленная по sizeof, содержит '\0'
  3 printf("%d\n",sizeof(arr)/sizeof(char));/,6, который имеет то же значение, что и предыдущий sizeof, является перезаписью

④、char arr[]={'H','e','l','l','o','\0'}; 

  Если вы не пишете '\0' в конце, это обычный массив символов, а не строка.

 ⑤、 char arr[6]="Привет"; 

  При определении массива фиксированной длины указанная длина должна быть как минимум на один бит больше фактической длины строки, оставляя место для '\0'. В этом примере массив <5 переполняется и не компилируется, а =5 не оставляет места для '\0', который является обычным массивом символов и не представляет собой строку.

  Строки должны заканчиваться '\0' в качестве закрывающего маркера, но массивы символов не обязаны содержать '\0'. Однако следует отметить, что при определении массива фиксированной длины, если фиксированная длина больше фактической длины строки, пустая часть будет автоматически заполнена '\0'. Например, char arr[5]="ab"; , на самом деле это так:'a','b','\0','\0','\0'

  1 символ arr[10]="привет";
  2 printf("%d\n",strlen(arr));//5
  3 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//10
  4 printf("%d\n",sizeof(arr)/sizeof(char));//10

⑥、char arr[6]={'H','e','l','l','o'};

  При определении массива фиксированной длины указанная длина должна быть как минимум на одну цифру больше, чем фактическая длина строки.Оставьте место для '\0', и '\0' будет добавлено автоматически. См. ⑤ для деталей.

Часто ошибочные методы определения:

  •  символ а[6]; а[6]="Привет"; 
  •   Причина ошибки: a[6] — символьная переменная, «Hello» — это адрес первого символа, которому нельзя присвоить значение.
  •  символ а[6]; а = "Привет"; символ []; а = "Привет";  
  •   Причина ошибки: Хотя имя массива a является указателем, оно уже указывало на место длиной 6 символов, выделенное для a[6] в памяти.Теперь есть адрес, указывающий на "Hello", и указатель будет сбит с толку. Обратите внимание на разницу с ②.

Уведомление:

Существует разница между определением строки как массива символов и определением строки как указателя:

1. При использовании формы массива символов из строкового константного слова копируется копия, при изменении содержимого массива символов модифицируется только копия, а строка в константном слове не затрагивается;

②, использование формы указателя повлияет на строку в постоянном слове.

 

рекомендация

отblog.csdn.net/weixin_55305220/article/details/122194814