c - 当我使用 "\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呢?
解决方案
正如评论部分所指出的,十六进制转义序列没有长度限制,并且在不是有效十六进制数字的第一个字符处终止。所有后续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' )
推荐阅读
- javascript - 根据按钮答案显示/隐藏内容
- spring - 我的 Spring Boot 应用程序能否仅在某些 @RequestMappings 上运行 HTTPS?
- python - Python scipy.optimize 曲线拟合的困难:未找到最佳参数:函数调用次数已达到 maxfev = 1000
- javascript - 为基于 Node.js 的 CLI 的单个版本运行一次代码
- git - git ls-tree blob sha 不是唯一的吗?
- mysql - 在 Laravel 中创建数据库
- c# - 检查钱箱是打开还是关闭
- java - Eclipse:导入“现有 Maven 项目”自动创建 EAR 项目
- bash - curl 命令有效负载中字符串的脚本连接
- java - 放大/缩小太快并出现奇怪错误时,Google Maps Activity 崩溃