String reference is not updated when calling a function in C ++

I am writing an arduino library to send an http request on the Internet.

I am using the String class from http://arduino.cc/en/Tutorial/TextString

My code behaves strangely when I access my specific string objects after a function call.

Actually, I am trying to get the body of my GET request and remove the http headers from the response to the HTTP GET request.

The following is a description:

Method call:

  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);
  }

Output

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

Method Description:

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;
}

Output:

Modified String: 
Ø
<html>
<head>
<title>Ashish Sharma
</title>
</head>
<body>
Wed Jan 13 20:06:28 IST 2010
</body>
</html>

Modified String Address: 2259

As you can see from the example, the string reference object gives me the correct string inside the Get method, but the link to the contents of the string changes when the Get method returns.

+3
source share
3

, , , - :

*response = response->substring(response->indexOf("\n\r\n"),response->length());

response = &response->substring(response->indexOf("\n\r\n"),response->length());

, , (, , ).

+3

-, , . , , . .

-, :

response = &response->substring(response->indexOf("\n\r\n"),response->length());

- : , , .

, , (String& response) , :

response = response->substring(response->indexOf("\n\r\n"),response->length());

, String, , =.

+3

Line

 Serial.println((int)&response);

inside your function, the wrong answer is already a pointer (String * response), with & get you get a pointer to a pointer.
Change it to

Serial.println((int)response);

and you should get the same address as with

 Serial.println((int)&body);

where body is a String and body is a pointer to a string

+1
source

Source: https://habr.com/ru/post/1728314/


All Articles