我有一个数组 -
char name[256];
sprintf(name, "hello://cert=prv:netid=%d:tsid=%d:pid=%d\0", 1010,1200, 1300);
QString private_data_string = name;
在此字符串的最后一个偏移处,即'\0'
,当我尝试执行以下操作时。
while(private_data_string.at(offset) != ':' &&
private_data_string.at(offset) != ';' &&
private_data_string.at(offset).isNull() == false)
应用程序中止。看起来数据指针在字符串'\'处也是零。我怎样才能解决这个问题?
答案 0 :(得分:1)
QString
不包含终止字符,因为您预期这会使断言失败超出范围。这是正确的方法:
while(offset<private_data_string.length() &&
private_data_string.at(offset) != ':' &&
private_data_string.at(offset) != ';') {
// ...
}
看起来你做的事情很奇怪。看起来你的问题是错的。你在问如何解决一些神秘问题的奇怪解决方案,而不是解释你想做什么,然后作为奖励:你是如何尝试解决它的。
答案 1 :(得分:1)
你需要了解几个事实:
\0
。默认情况下,字符串文字以空值终止。文字"abc"
实际上包含4个字符,包括终止空字符。您的字符串文字在其末尾有2个空字符。QString(char*)
。没有关于缓冲区长度的其他数据,因此QString
从缓冲区中读取字符,直到遇到第一个空字符。实际上最后有多少个空字符并不重要。空字符被解释为缓冲区结束标记,而不是字符串的一部分。QString::at
函数可用于职位0 <= position < size()
。这在文档中明确指定。因此,QString的内部缓冲区是否以空值终止并不重要。无论哪种方式,您都无权访问null终止符。QByteArray
代替QString
。它允许在构造时指定缓冲区大小,并且可以包含任意数量的空字符。但是,在处理字符串时,通常没有必要。您应该使用QString::arg
代替sprintf
:
QString private_data_string =
QString("hello://cert=prv:netid=%1:tsid=%2:pid=%3")
.arg(netid).arg(tsid).arg(pid);
sprintf
不安全,如果不小心,可能会超出固定大小的缓冲区。在C ++中,没有充分的理由使用sprintf。
"A QString that has not been assigned to anything is null, i.e., both the length and data pointer is 0"
- 这与您的情况无关,因为已为您的字符串分配了值。