WiFi.SSID gibt eigenartige Zeichen aus

Hi,
ich möchte die verfügbaren WiFi Netzwerke auslesen und in eine Liste speichern.
Das funktioniert soweit auch ganz gut, doch die String Ausgabe sieht bei längeren SSIDs eigenartig aus ...
Serial.printf("%s", WiFi.SSID(i).c_str()); // funktioniert
Serial.printf("%s", WiFi.SSID(i)); // funktioniert nur mit kurzen SSIDs

z.B. (String in () ist WiFi.SSID() )

Nr | SSID | RSSI | CH | Encryption
1 | M&R_K( M&R_K ) | -56 | 6 | WPA2
2 | Vodafone Homespot( �t�? ) | -67 | 1 | open
3 | Vodafone Hotspot( ���? ) | -67 | 1 | open
4 | M&R_K_24( M&R_K_24 ) | -67 | 1 | WPA2
5 | WLAN-746906( WLAN-746906 ) | -71 | 11 | WPA2
6 | M&R_K( M&R_K ) | -78 | 6 | WPA2
7 | Vodafone-F96B( Vodafone-F96B ) | -86 | 11 | WPA2

Habe jetzt schon auf verschiedensten Wegen versucht den String zusammenzubasteln, aber es funktioniert nicht ...

Was mache ich falsch ?

Vielen Dank für eure Hilfe

Vermutlich gibt WiFi.SSID(i) kein char* zurück aber %s im Formatstring von printf() erwartet das.

Wenn WiFi.SSID(i).c_str() überhaupt erlaubt ist, liefert WiFi.SSID(i) natürlich kein char*, sondern ein String Objekt. Das passt nicht zu printf("%s", .... );

Serial.print kann wahlweise const char* oder den Text eines String Objekts ausgeben

Serial.print(WiFi.SSID(i));  // geht
Serial.print(WiFi.SSID(i).c_str()); // geht auch


Aber wenn dem so wäre, warum passiert das nur bei Namen die >=16 Bytes lang sind?

Habs mal in wokwi ausprobiert.
Du hast Recht, @royw72

void setup() {
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
}
String s;
void loop() {
  delay(1000); 
  Serial.println(s);
  Serial.printf("%s\n", s); 
  s = "a"+ s;
}

Die einzige Erklärung die mir einfällt: Undefiniertes Verhalten ist eben undefiniert.

Wer's nicht kopieren möchte, findets auch unter

Aber mit

Serial.printf("%s", s.c_str()); 

geht es auf Wokwi.

Gruß Tommy

Natürlich geht das. Verwunderlich ist, dass
Serial.printf("%s", s);
überhaupt geht, bei kurzen Texten.

Und sogar immer gleich, egal wo das String Objekt liegt.
Aber undefiniertem Verhalten hinterher zu forschen ist immer Mist.

Hmm, dann ist das wohl so.
Dann wäre meine nächste Frage wie ich ein dynamisches Array von Char* anlege ?

Wofür?
Auf einem Mikrocontroller am Besten nicht und wenn doch (auf eigene Gefahr) dann mit Prüfung des Return-Codes und wieder Aufräumen des Speichers. Evtl. suchst Du malloc(...);

Gruß Tommy

Okay, es scheint nur die Ausgabe zu sein. Wenn ich da .c_str() nutze bekomme ich die richtigen Zeichen.
Hatte die vorhandenen WiFi Netze gescannt und in einem Vector of Strings gespeichert .
Diese habe ich dann in einer eigenen WiFiClient Website in einer Combobox dargestellt.
Das habe ich aber ohne .c_str() getan und da war die Anzeige dort und im Seriellen Monitor fehlerhaft. Ich dachte das das Speichern der Netzwerknamen schon fehlerhaft ist, aber es waren nur die Printf Ausgaben.

Damit kann ich erst einmal weitermachen.

Dankeschön

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.