我的类有一个成员std::string received;
,在其构造函数中以空字符串初始化,还有一个函数printReceived
,它将字符串打印到cout
。
在main()
中,创建了上述类的实例,并调用了printReceived
。
我没有获得空字符串,而是完全意外的值(但总是相同):
如果printReceived
为std::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:
答案 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
处理,因为这种事情是不可能的发生。