如果字符串中间有空字符,如何处理字符串?

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

  1. 字符串以空字符(\0)结尾,如何输出“e”?
  2. 在 <string.h> 中没有函数,我如何使用 str1 分配苹果?

use*_*751 7

在 C 字符串的中间不能有空字符,因为根据定义,空字符会结束字符串。

可以使用其中一些为空字符的字符数组,但您必须将它们视为数组,而不是字符串。所以你必须自己跟踪长度。


Vla*_*cow 5

字符串以空字符(\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)