std :: string获得完全意外的值

时间:2011-09-05 23:25:39

标签: c++ string

我的类有一个成员std::string received;,在其构造函数中以空字符串初始化,还有一个函数printReceived,它将字符串打印到cout

main()中,创建了上述类的实例,并调用了printReceived

我没有获得空字符串,而是完全意外的值(但总是相同):

  • 如果printReceivedstd::cout<<"Received ":<<received<<std::endl;,我会

    Received: eived:作为输出。

  • 另一个类的函数中存在的字符串常量,如果此文件已链接,则不会被称为

哪里可以来的?这让我很生气......所有变量都被正确初始化了。我之前从未遇到过这个问题,而且我用C ++编写了很多程序。

这是一个完整的最小例子:

CellularTest.cpp

#include "A.h"

#include <iostream>

int main()
{
    A s;

    s.println("AT+CSQ");

    return 0;
}

A.cpp

#include "A.h"

A::A()
: received("")
{
}
void A::println(char* s)
{
    received+=s+'\n';
    treatReceived();
}
void A::treatReceived()
{
    std::cout<<"Received: "<<received<<std::endl;
}

A.H

#include <iostream>
#include <string>

class A
{
    public:
        A();
        void println(char* s);
    private:
        std::string received;
        void treatReceived();
};

生成文件

CellularTest: CellularTest.o CellularTest.cpp A.o
    g++ CellularTest.o A.o -o CellularTest

CellularTest.o: CellularTest.cpp

A.o: A.cpp A.h

clean:
    rm *.o
    rm CellularTest

我得到的输出是:

Received: eived: 

2 个答案:

答案 0 :(得分:6)

operator+=的优先级低于operator+。所以在println,你这样做:

received+=(s+'\n');

这就像

received+=(s+10);

将指针s递增10个字节,然后将结果char*指向的字符串追加到received,字符串文字Recieved:正在发生存储在字符串文字AT+CSQ之后。因此,内存可能看起来像AT+CSQ\0Received: \0,将AT+CSQ递增10实际上是e中的Received:。所以你有它。

将其更改为

received+=s;
received+='\n';

或者

received = received + s + '\n';

答案 1 :(得分:1)

void A::println(char* s)
{
    received+=s+'\n';

你显然从未处理过原始字符串。首先 - 始终采用const char*std::string - 因为修改内容是未定义的行为。其次,您的+实际上正在执行指针算术,即received += &s['\n'];连接。主机字符串显然不足以容纳\n的值大约为13,IIRC,因此您的程序显示未定义的行为。

如果你想在C ++中使用字符串,并且你不是很确定你正在做什么,总是std::string处理,因为这种事情是不可能的发生。