如何解决如何在ascii值超过127的字符串中找到8位子字符串?
我正在努力解决一个问题,试图解决字符串中的按位子字符串。在下面的示例中,这个简单的小函数对值0-127进行了预期的操作,但是如果我尝试使用大于127的ASCII值,则该函数失败。我认为这是因为字符串本身是带符号的。但是,如果我使它成为无符号的,不仅会遇到问题,因为显然strlen()
不能对无符号的字符串进行操作,而且还会得到一个警告,它是一个多字符常量。为什么要使用多个字符?我想我已经尝试了一切。我可以做些什么来使值大于127的工作吗?
#include <iostream>
#include <cstring>
const unsigned char DEF_KEY_MINOR = 0xAD;
const char *buffer = { "jhsi≠uhdfiwuui73" };
size_t isOctetInString(const char *buffer,const unsigned char octet)
{
size_t out = 0;
for (size_t i = 0; i < strlen(buffer); ++i)
{
if(!(buffer[i] ^ octet))
{
out = i;
break;
}
}
return out;
}
int main() {
std::cout << isOctetInString(buffer,'i') << "\n";
std::cout << isOctetInString(buffer,0x69) << "\n";
std::cout << isOctetInString(buffer,'≠') << "\n";
std::cout << isOctetInString(buffer,0xAD) << "\n";
return 0;
}
输出
3
3
0
0
修改
基于注释,我尝试了一些不同的操作,包括将八位字节和缓冲区强制转换为unsigned int和wchar_t,以及从八位字节参数类型中删除未签名的char。有了这些输出,我得到的都是
3
3
6
0
我什至尝试用
替换缓冲区中的≠charconst char *buffer = {'0xAD',"jhsiuhdfiwuui73"};
但是我仍然收到有关多字节字符的警告。
正如我之前说的,我主要关心的是能够找到字符串中的位序列0xAD,但是现在我看到使用ascii字符或任何使用ascii字符集的构造都会引起问题。由于0xAD
只有8位,因此必须有一种方法。有人知道这样做的方法吗?
解决方法
符号扩展名- buffer [i] ^ octet 实际上是未签名的(int(buffer [i]))^ unsigned(octet)。如果要将buffer []设为无符号字符,则必须以这种方式进行定义。
,您的问题有多种困惑来源:
-
可以使用
unsigned char
完成字符串中的strchr()
值搜索,该操作会将int
参数和char
数组中的字符都转换为{ {1}}进行比较。 -
您的函数使用
unsigned char
来检测匹配项,如果对if(!(buffer[i] ^ octet))
进行了签名,则该匹配项将不起作用,因为该表达式的值为char
且仅对{ {1}}。一个简单的解决方案是:if(!((int)buffer[i] ^ (int)octet))
-
请注意,在源代码和终端处理程序中,字符
buffer[i]
在目标系统上可能被编码为多个字节,例如代码点≠为8800或0x2260在UTF-8中编码为0xE2 0x89 0xA0。语法if ((unsigned char)buffer[i] == octet)
会带来问题。我不确定C ++如何处理多字节字符常量,但C会接受具有实现特定值的它们。 -
要查看系统如何处理非ASCII字节,可以将以下行添加到
≠
函数中:'≠'
或更明确地说:
main()
在我的linux系统上,后者输出:
≠ is encoded as E2 89 A0 and '≠' has a value of 0xE289A0
在我的MacBook上,编译失败并显示以下错误:
std::cout << "≠ uses " << sizeof("≠") - 1 << "bytes\n"; std::cout << "'≠' has the value " << (int)'≠' << "\n";
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。