Question

I have an array -

char name[256];
sprintf(name, "hello://cert=prv:netid=%d:tsid=%d:pid=%d\0", 1010,1200, 1300);
QString private_data_string = name;

At the last offset of this string i.e. '\0',when I try to do the following.

while(private_data_string.at(offset) != ':' &&
    private_data_string.at(offset) != ';' &&
    private_data_string.at(offset).isNull() == false)

The application aborts. Looks like that the data pointer is also zero at the string '\'. How can I fix this?

Was it helpful?

Solution

QString doesn't contain terminating character as you expect that is why you are failing assertion out of bounds. This is proper approach:

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

It looks like you are doing something strange. Looks like your question is wrong. You are asking how to fix your strange solution of some mysterious problem, instead explain what are you trying to do and then as a bonus: how did you try to solve it.

OTHER TIPS

You need to know several facts:

  • Writing \0 at tge end of your string literal is not necessary. String literals are null-terminated by default. Literal "abc" will actually contain 4 characters including terminating null character. Your string literal has 2 null characters at its end.
  • You have used the default constructor QString(char*). There is no additional data about buffer's length, so QString reads characters from the buffer until it encounters first null character. It doesn't matter how many null characters are actually at the end. The null character is interpreted as a buffer end marker, not a part of the string.
  • When you have QString "abc", its size is 3 (it would be surprising to have another value). Null character is not a part of the string. QString::at function can be used for positions 0 <= position < size(). This is explicitly specified in the documentation. So it doesn't matter if QString's internal buffer is null-terminated or not. Either way, you don't have access to null terminator.
  • If you really want null character to be part of your data, you should use QByteArray instead of QString. It allows to specify buffer size on construction and can contain as many null characters as you want. However, when dealing with strings, it's usually not necessary.
  • You should use QString::arg instead of sprintf:

    QString private_data_string = 
       QString("hello://cert=prv:netid=%1:tsid=%2:pid=%3")
       .arg(netid).arg(tsid).arg(pid);
    

    sprintf is unsafe and can overrun your fixed-size buffer if you're not careful. In C++ there's no good reason to use sprintf.

  • "A QString that has not been assigned to anything is null, i.e., both the length and data pointer is 0" - this has nothing to do with your situation because you have assigned a value to your string.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top