如何将字符数组转换为qstring?

时间:2014-01-27 10:17:00

标签: qt qt4

我有一个数组 -

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)

应用程序中止。看起来数据指针在字符串'\'处也是零。我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

QString不包含终止字符,因为您预期这会使断言失败超出范围。这是正确的方法:

while(offset<private_data_string.length() &&
      private_data_string.at(offset) != ':' &&
      private_data_string.at(offset) != ';') {
   // ...
}

看起来你做的事情很奇怪。看起来你的问题是错的。你在问如何解决一些神秘问题的奇怪解决方案,而不是解释你想做什么,然后作为奖励:你是如何尝试解决它的。

答案 1 :(得分:1)

你需要了解几个事实:

  • 不必在字符串文字的tge末尾写\0。默认情况下,字符串文字以空值终止。文字"abc"实际上包含4个字符,包括终止空字符。您的字符串文字在其末尾有2个空字符。
  • 您使用了默认构造函数QString(char*)。没有关于缓冲区长度的其他数据,因此QString从缓冲区中读取字符,直到遇到第一个空字符。实际上最后有多少个空字符并不重要。空字符被解释为缓冲区结束标记,而不是字符串的一部分。
  • 如果你有QString“abc”,它的大小是3(拥有另一个值会令人惊讶)。空字符不是字符串的一部分。 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" - 这与您的情况无关,因为为您的字符串分配了值。