我是一个相对缺乏经验的程序员,我对转义的反斜杠感到困惑。我使用包含文字反斜杠的字符串来表示 Windows 文件路径(由于某种原因,即使 Windows 支持它们,正斜杠也不起作用)并且双反斜杠被 Windows 接受,但是,由于某种原因,与其他转义字符不同,双反斜杠被 strlen() 计算为两个字符而不是一个,我必须为转义字符 malloc() 一个额外的字节以防止段错误。其他转义如 ' ' 似乎工作正常并算作单个字符。为什么我的双反斜杠
"foo\\bar"
算作两个字符而不是一个?
我正在使用 VSCodium 编写代码,并在 MSYS2 中使用 MinGW64 GCC 进行编译。
字符串的长度确实正确。考虑以下代码。
#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"));
}