Hwa*_*ang 1 c c-strings string-literals null-character
我知道字符串以 NULL 结尾。但是如果字符串中间有一个空字符(\0),我该如何处理这个字符串?
#include<stdio.h>
#include<string.h>
int main(){
char *str = "App\0le";
char *str2;
printf("%c", *(str+5));
}
Run Code Online (Sandbox Code Playgroud)
输出:e
字符串以空字符(\0)结尾,如何输出“e”?
字符串文字"App\0le"作为具有以下元素的未命名字符数组存储在内存中
char unnamed_string_literal[7] = { 'A', 'p', 'p', '\0', 'l', 'e', '\0' };
Run Code Online (Sandbox Code Playgroud)
本声明
char *str = "App\0le";
Run Code Online (Sandbox Code Playgroud)
考虑到上述假设可以按以下方式重写
char *str = unnamed_string_literal;
Run Code Online (Sandbox Code Playgroud)
因此,使用指针算术并预先了解字符串文字中的元素数量(包括其嵌入的零字符),您可以输出表示字符串文字的字符数组的任何元素。
例如
#included <stdio.h>
int main( void )
{
char *str = "App\0le";
for (size_t i = 0; i < 7; i++)
{
if (str[i] == '\0')
{
putchar( '\\' ), putchar( '0' );
}
else
{
putchar( str[i] );
}
}
putchar( '\n' );
}
Run Code Online (Sandbox Code Playgroud)
程序输出是
App\0le\0
Run Code Online (Sandbox Code Playgroud)
即该表达式是访问数组元素str[i]的表达式。i-th数组的类型和它存储的内容完全不重要。
如果你会写
char *str2 = str;
Run Code Online (Sandbox Code Playgroud)
那么指针 str2 将指向指针所指向的同一字符串文字的第一个字符str。
如果您需要获取字符串,那么您需要声明一个字符数组,例如
char str2[6];
Run Code Online (Sandbox Code Playgroud)
并将指针指向的字符串文字的字符复制到其中,str不包括嵌入的零字符,但包括终止零字符。您不能更改字符串文字本身,因为任何更改字符串文字的尝试都会导致未定义的行为。
例如(不使用标准 C 字符串函数)
#include <stdio.h>
int main( void )
{
char *str = "App\0le";
char str2[6];
size_t i = 0;
while (( str2[i] = str[i] ) != '\0') i++;
while (( str2[i] = str[i + 1] ) != '\0') i++;
puts( str2 );
}
Run Code Online (Sandbox Code Playgroud)
程序输出是
Apple
Run Code Online (Sandbox Code Playgroud)