C 中的转义反斜杠(双反斜杠)在字符串中算作两个字节

问题描述 投票:0回答:1

我是一个相对缺乏经验的程序员,我对转义的反斜杠感到困惑。我使用包含文字反斜杠的字符串来表示 Windows 文件路径(由于某种原因,即使 Windows 支持它们,正斜杠也不起作用)并且双反斜杠被 Windows 接受,但是,由于某种原因,与其他转义字符不同,双反斜杠被 strlen() 计算为两个字符而不是一个,我必须为转义字符 malloc() 一个额外的字节以防止段错误。其他转义如 ' ' 似乎工作正常并算作单个字符。为什么我的双反斜杠

"foo\\bar"
算作两个字符而不是一个?

我正在使用 VSCodium 编写代码,并在 MSYS2 中使用 MinGW64 GCC 进行编译。

c char escaping
1个回答
0
投票

字符串的长度确实正确。考虑以下代码。

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

int main(int argc, const char *argv[])
{
    printf("%d\n", (int)strlen("foo\\bar"));
}

如果我们编译并运行该代码,我们会在控制台中看到

7
。那么,为什么字符串的长度看起来是
8
呢?这是因为它是空终止的。每当你写
"foo"
时,这实际上是
{ 'f', 'o', 'o', 0 }
的语法糖。它添加零的原因是,每当函数需要对字符串进行操作时,它不会存储字符串的length。相反,您可以通过查找
0
来确定运行时的长度。

为了证明这个理论,请使用对此字符串使用的任何长度检查方法:

"foo\\\\ar"
。如果您尝试此字符串,它也会返回
8
的长度。

您可能正在使用

sizeof
,所以您可以尝试如下。

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

int main(int argc, const char *argv[])
{
    printf("%d\n", (int)sizeof("foo\\\\ar"));
}
© www.soinside.com 2019 - 2024. All rights reserved.