gpt4 book ai didi

c++ - strlen() 不适用于特殊字符

转载 作者:行者123 更新时间:2023-11-30 03:17:27 26 4
gpt4 key购买 nike

当尝试使用 的 strlen 函数确定低级字符串的长度时,我注意到当字符串包含英语中不存在的西类牙字符时,它无法正常工作,例如感叹号开头符号! 、重音符号或字母 ñ。所有这些元素都算作两个字符,这种情况在 Locale 中没有解决。

#include <cstring>
#include <iostream>

int main() {
const char * s1 = "Hola!";
const char * s2 = "¡Hola!";
std::cout << s1 << " has " << strlen(s1) << " elements, but " << s2
<< " has " << strlen(s2) << " intead of 6" << std::endl;
}

这是大学关于低级字符串的工作,所以不可能将库用作字符串。

最佳答案

strlen 给出其参数指向的缓冲区中非零 char 对象的数量,直到第一个零 char .您的系统显然使用了一种字符编码(很可能是 UTF-8),其中这些有问题的字符占用了多个字节(即,多个 char 对象)。

如何解决这个问题取决于您要做什么。对于某些操作(例如确定存储字符串所需的缓冲区大小),strlen 的结果是 100% 正确的,因为它正是您所需要的。对于大多数其他目的,欢迎来到字符/字节/代码点/任何细微差别的广阔世界。您可能想阅读有关文本编码、Unicode 等的内容。http://utf8everywhere.org/可能是一个不错的起点。

您提到这是一项大学作业:根据教学目标,您可能需要实现某种形式的 UTF 编码/解码,或者只是避开非 ASCII 字符。

关于c++ - strlen() 不适用于特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494109/

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