在我的应用程序中,我从本地(非Unicode)字符集中的文件中读取字符串字段。 该字段是10个字节,如果字符串<则字符串用0填充。 10个字节。
char str ="STRING\0\0\0\0"; // that was read from file
QByteArray fieldArr(str,10); // fieldArr now is STRING\000\000\000\000
fieldArr = fieldArr.trimmed() // from some reason array still containts zeros
QTextCodec *textCodec = QTextCodec::codecForLocale();
QString field = textCodec->ToUnicode(fieldArr).trimmed(); // also not removes zeros
所以我的问题 - 如何从字符串中删除尾随零?
P.S。在debuging
时,我在“Local and Expressions”窗口中看到了零答案 0 :(得分:2)
我将假设str
应该是char const *
而不是char
。
只是不要过去QByteArray
- QTextCodec
可以处理一个C字符串,它以第一个空字节结束:
QString field = textCodec->toUnicode(str).trimmed();
附录:由于字符串可能不是零终止,因此将空字节的存储添加到最后似乎是不可能的,并且制作副本以准备制作副本似乎是浪费,我建议自己计算长度并使用接受char指针和长度的toUnicode
重载。
std::find
对此有好处,因为如果在其中找不到元素,它将返回给定范围的结束迭代器。这使得不需要特殊情况处理:
QString field = textCodec->toUnicode(str, std::find(str, str + 10, '\0') - str).trimmed();
答案 1 :(得分:0)
我会这样做:
char* str = "STRING\0\0\0\0";
QByteArray fieldArr;
for(quint32 i = 0; i < 10; i++)
{
if(str[i] != '\0')
{
fieldArr.append(str[i]);
}
}
答案 2 :(得分:0)
QString
。选择编解码器的方式与在代码中手动操作的方式相同。
您需要手动将长度设置为10,因为您说您无法保证存在终止空字节。
然后你可以使用remove()
来删除所有空字节。警告:STRI\0\0\0\0NG
也会产生STRING
,但您说这不会发生。
char *str = "STRING\0\0\0\0"; // that was read from file
QString field = QString::fromLocal8Bit(str, 10);
field.remove(QChar::Null);
答案 3 :(得分:0)
这对你有用吗?
#include <QDebug>
#include <QByteArray>
int main()
{
char str[] = "STRING\0\0\0\0";
auto ba = QByteArray::fromRawData(str, 10);
qDebug() << ba.trimmed(); // does not work
qDebug() << ba.simplified(); // does not work
auto index = ba.indexOf('\0');
if (index != -1)
ba.truncate(index);
qDebug() << ba;
return 0;
}
使用fromRawData()
可以保存额外的副本。确保str
留下来,直到您删除ba
。
indexOf()
, str
也是安全的
QByteArray
知道您只能安全访问10个字节。它
不会触及11日或之后。没有缓冲区溢出。
删除额外的\0
后,转换为QString
是微不足道的。
答案 4 :(得分:0)
您可以截断第一个\0
之后的字符串:
char * str = "STRING\0\0\0\0"; // Assuming that was read from file
QString field(str); // field == "STRING\0\0\0\0"
field.truncate(field.indexOf(QChar::Null)); // field == "STRING" (without '\0' at the end)