文字列の参照はCで関数呼び出しで更新されない++
質問
私は、ウェブ上のhttpリクエストを投稿するArduinoのライブラリを書いています。
私は 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メソッド戻ります。
解決
、あなたはおそらくこのような何かをしたいと思う。
*response = response->substring(response->indexOf("\n\r\n"),response->length());
の代わりに
response = &response->substring(response->indexOf("\n\r\n"),response->length());
また、(おそらく、コードは非常に良く見えるようになり、参照)をポインタで渡す必要はおそらくありません。
他のヒント
まず最初に、あなたは、文字列、文字列ではなく自分自身ののアドレスのをmodyfyingています。しかし、文字列のアドレスはの値によって関数のに渡されたので、コピーされました。関数の内部でそれを修正すると、外側にそれを変更しません。
第二に、ここでは、このコードが悪います:
response = &response->substring(response->indexOf("\n\r\n"),response->length());
これは一時的なオブジェクトへのポインタ作成するので - 意味:ダングリングポインタ式が評価された後、一時的なオブジェクトが破棄されるために、
は、<全角>本当にの必要はありませんそのポインタ、それを参照(String& response
)によってオブジェクトを渡すと変更あり
response = response->substring(response->indexOf("\n\r\n"),response->length());
この作業をする必要があり、使用の提供のString
クラスが正しく代入演算子の=
の動作をオーバーロードします。
の行
Serial.println((int)&response);
あなたの関数の内部では、間違った応答は、あなたがポインタへのポインタを取得して&レスポンス、すでにポインタ(文字列*応答)である。
Serial.println((int)response);
とあなたと同じアドレスを取得する必要があります。
Serial.println((int)&body);
体は文字列であり、・本体は文字列へのポインタである