gpt4 book ai didi

c - 当我使用 "\x00"中断字符串时,C 中的字符串长度是多少?

转载 作者:行者123 更新时间:2023-12-02 18:31:39 25 4
gpt4 key购买 nike

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呢?

最佳答案

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

你应该改变

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

至:

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

此外,strlen 返回 size_t 类型的值。 size_t 的正确 printf 格式说明符是 %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' )

string literal 之间有很大的区别。和一个character constant .

关于c - 当我使用 "\x00"中断字符串时,C 中的字符串长度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69331873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com