我正在编写一个arduino库,以便在网上发布http请求。
我正在使用http://arduino.cc/en/Tutorial/TextString
中的String类当我在函数调用后引用我定义的字符串对象时,我的代码表现得很奇怪。
实际上,我试图获取GET请求的正文并从http GET请求的响应中删除http标头。
以下是描述:
方法调用:
String body;
if(pinger.Get(host,path,&body))
{
Serial.println("Modified String Outside :");
Serial.println(body);
Serial.println();
Serial.println("Modified String Outside Address");
Serial.println((int)&body);
}
输出
Modified String Outside :
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
Content-Length: 113
Date: Wed, 13 Jan 2010 14:36:28 GMT
<html>
<head>
<title>Ashish Sharma
</title>
</head>
<body>
Wed Jan 13 20:06:28 IST 2010
</body>
</html>
Modified String Outside Address
2273
方法描述:
bool Pinger::Get(String host, String path, String *response) {
bool connection = false;
bool status = false;
String post1 = "GET ";
post1 = post1.append(path);
post1 = post1.append(" HTTP/1.1");
String host1 = "Host: ";
host1 = host1.append(host);
for (int i = 0; i < 10; i++) {
if (client.connect()) {
client.println(post1);
client.println(host1);
client.println();
connection = true;
break;
}
}
int nlCnt = 0;
while (connection) {
if (client.available()) {
int c = client.read();
response->append((char) c);
if (c == 0x000A && nlCnt == 0) {
nlCnt++;
if (response->contains("200")) {
status = true;
continue;
} else {
client.stop();
client.flush();
break;
}
}
}
if (!client.connected()) {
client.stop();
connection = false;
}
}
response = &response->substring(response->indexOf("\n\r\n"),response->length());
Serial.println("Modified String: ");
Serial.println(*response);
Serial.println();
Serial.print("Modified String Address: ");
Serial.println((int)&response);
return status;
}
输出:
Modified String:
Ø
<html>
<head>
<title>Ashish Sharma
</title>
</head>
<body>
Wed Jan 13 20:06:28 IST 2010
</body>
</html>
Modified String Address: 2259
从示例中可以看出,字符串引用对象在Get方法中给出了正确的字符串,但是当Get方法返回时,字符串内容的引用会发生变化。
答案 0 :(得分:3)
首先,您正在修改字符串的地址,而不是字符串本身。但是字符串的地址通过值传递给函数,然后被复制。在函数内修改它不会在外面修改它。
其次,这里的代码很糟糕:
response = &response->substring(response->indexOf("\n\r\n"),response->length());
因为它创建了一个指向临时对象的指针 - 这意味着:一个悬空指针,因为临时对象在表达式被评估后将被销毁。
你真正想要的是通过引用传递对象(String& response
)并修改它,而不是它的指针:
response = response->substring(response->indexOf("\n\r\n"),response->length());
这应该可行,提供您正确使用的String
类会重载赋值运算符=
的行为。
答案 1 :(得分:3)
如果我理解你的代码,你可能会想要做这样的事情:
*response = response->substring(response->indexOf("\n\r\n"),response->length());
而不是
response = &response->substring(response->indexOf("\n\r\n"),response->length());
此外,可能没有必要传入指针(引用可能会使代码看起来更好)。
答案 2 :(得分:1)
该行
Serial.println((int)&response);
你的函数内部错误响应已经是一个指针(String * response),带有&amp;响应你得到指针的指针。
将其更改为
Serial.println((int)response);
你应该得到与
相同的地址 Serial.println((int)&body);
其中body是String,&amp; body是指向字符串的指针