strlen()不能与特殊字符配合使用

时间:2019-04-03 11:30:54

标签: c++ string char

当尝试使用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;
}

这是大学针对低级字符串的一项工作,因此无法将库用作字符串。

1 个答案:

答案 0 :(得分:2)

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

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

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