首页 > 解决方案 > 当我使用 "\x00" 中断字符串时,C 中字符串的长度是多少?

问题描述

char buf1[1024] = "771675175\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
char buf2[1024] = "771675175\x00";
char buf3[1024] = "771675175\0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
char buf4[1024] = "771675175\0";
char buf5[1024] = "771675175";
buf5[9] = 0;
char buf6[1024] = "771675175";
buf6[9] = 0;
buf6[10] = "A";

printf("%d\n", strlen(buf1));
printf("%d\n", strlen(buf2));
printf("%d\n", strlen(buf3));
printf("%d\n", strlen(buf4));
printf("%d\n", strlen(buf5));
printf("%d\n", strlen(buf6));

if("\0" == "\x00"){
    printf("YES!");
}

输出:

10
9
9
9
9
9
YES!

如上所示,我使用"\x00"来中断一个字符串。据我所知,当 strlen() 遇到 时"\x00",它会返回终止符之前的字符数,并且不包括"\x00". 但是这里,为什么buf1的长度等于10呢?

标签: c

解决方案


正如评论部分所指出的,十六进制转义序列没有长度限制,并且在不是有效十六进制数字的第一个字符处终止。所有后续A字符都是有效的十六进制数字,因此它们是转义序列的一部分。因此,转义序列的结果不适合 a char,因此未指定结果。

你应该改变

char buf1[1024] = "771675175\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

到:

char buf1[1024] = "771675175\x00" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

此外,strlen返回 type 的值size_t。正确的printf格式说明符size_t%zu,不是%d。即使%d在您的平台上工作,它也可能在其他平台上失败。

以下程序将打印所需的结果9

#include <stdio.h>
#include <string.h>

int main( void )
{
    char buf1[1024] = "771675175\x00" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

    printf( "%zu\n", strlen(buf1) );
}

此外,以下行没有意义是毫无意义的:

if("\0" == "\x00")

在这种if情况下,您正在比较两个指针的地址,它们指向字符串文字。这取决于编译器是否将两个字符串文字存储在同一内存位置。一些编译器可能会将相同的字符串文字合并到相同的内存位置,有些可能不会。通常,这与程序员无关。因此,比较这些内存地址没有多大意义。

您可能想改写以下内容,它将比较实际的字符值:

if( '\0' == '\x00' )

字符串文字字符常量之间有很大的区别。


推荐阅读