*.replace(); funktioniert auf dem Arduino Uno Wifi Rev. 2 nicht

Hallo zusammen,

ich möchte nochmal einen neues, sauberes topic zu einer bereits gestellten Frage aufmachen. Folgende einfache Befehlsfolge kann auf dem Arduino Uno Wifi Rev. 2 nicht sauber bearbeitet werden:

String currentLine = "%2216%22,%20%2217%22";

void setup()
{
  Serial.begin(115200);
  Serial.println(currentLine);
  currentLine.replace("%22","");
  Serial.println(currentLine); 
  currentLine.replace("%20","");
  Serial.println(currentLine);  
  Serial.println("Das Ergebnis sollte 16,17 sein, ist es aber nicht.");
}

void loop()
{
}

Ich habe dies auf verschiedenen Arduino Uno Wifi Rev. 2 versucht, bekomme aber auf beiden Geräten das falsche Ergebnis heraus. Woran liegt das genau und gibt es da irgendeinen Workaround?

Grüße

Das hatten wir doch schon mal besprochen, Problem mit currtentLine.replace - #51 by Rentner Und auch wenn Du die Fragestellung erneut versuchst vorzukauen, weil Du den bestehenden Thread nicht nutzen willst, wird die Antwort die Selbe sein:
Entweder Du nimmst einen Workarround oder ein anderes Board.

Ich erhalte:
%2216%22,%2217%22
Soll:
16,17

Ganzer serial output:

%2216%22,%20%2217%22
%2216%22,%20%2217%22
%2216%22,%2217%22
Das Ergebnis sollte 16,17 sein, ist es aber nicht.

Da der Thread sich wiederholt, wiederhole ich auch meine Ansage:
Dieses mal etwas lauter!
Wenn du eine URL/URI decodieren willst, dann verwende auch urldecode()
Logisch oder?
Das gibts in etlichen Varianten im Netz.
Vielleicht sogar in deiner Board Definition.

Zudem:
Wenn die String Implementierung dieser Board Definition defekt ist, dann repariere sie doch bitte. Da haben dann "alle" was von.
In den anderen Board Definitionen stecken ja offensichtlich funktionierende Varianten.

Wie wandle ich meine String-Objekte in C-Zeichenketten?

Es ist nicht sehr konstruktiv, ohne weitere Ausführungen zu sagen, dass es an der String-Klasse liegt. Diese Klasse erledigt die Job für die überwiegende Mehrheit der Fälle, wenn Sie sie ein wenig vorsichtig verwenden.

Das Problem ist, dass die String-Klasse in der Version für die MEGA-AVR-Architektur nicht mit den Fortschritten in anderen Architekturen auf dem Laufenden gehalten wurde

Das Arduino Uno Wifi scheint nicht sehr viel verwendet zu werden (besser direkt zu einem ESP32 zu gehen), daher kann es sein, dass es nicht die notwendige Aufmerksamkeit erhält....

Ich würde vorschlagen, einen Fehler zu melden in

Wenn Sie es beheben möchten, müssen Sie zur neuesten String-Klasse wechseln (vielleicht nicht so einfach wie das Kopieren der neuesten Version).

Schau mal hier

char currentLine[] = "%2216%22,%20%2217%22";

char* removestr(char* str, const char* str2Remove) {
  if ((str == nullptr)) return str;

  size_t len = strlen(str);
  if (len == 0) return str;

  size_t len2Remove = strlen(str2Remove);
  if (len2Remove == 0) return str;

  char *readFrom = str;
  char *foundAt;
  while ((foundAt = strstr(readFrom, str2Remove)) != NULL) {
    memmove(foundAt, foundAt + len2Remove, (readFrom + len) - (foundAt + len2Remove) + 1); // move the '\0' at the same time
    readFrom = foundAt;
    len -= len2Remove;
  }
  return str;
}

void setup()
{
  Serial.begin(115200);
  Serial.println(currentLine);
  removestr(currentLine, "%22");
  Serial.println(currentLine);
  removestr(currentLine, "%20");
  Serial.println(currentLine);
  Serial.println("Das Ergebnis sollte 16,17 sein");
}

void loop() {}

Danke für den Code.
Das Problem ist allerdings, dass ich ja als Ausgang einen String habe in meinem Programmablauf und nicht einfach einen char currentLine = "%2216%22,%20%2217%22"; definieren kann. Deshalb verwende ich currentLine.toCharArray, um einen char zu bekommen. Dann funktioniert aber removestr wieder nicht...

char* removestr(char* str, const char* str2Remove) {
  if ((str == nullptr)) return str;

  size_t len = strlen(str);
  if (len == 0) return str;

  size_t len2Remove = strlen(str2Remove);
  if (len2Remove == 0) return str;

  char *readFrom = str;
  char *foundAt;
  while ((foundAt = strstr(readFrom, str2Remove)) != NULL) {
    memmove(foundAt, foundAt + len2Remove, (readFrom + len) - (foundAt + len2Remove) + 1); // move the '\0' at the same time
    readFrom = foundAt;
    len -= len2Remove;
  }
  return str;
}

void setup()
{
  Serial.begin(115200);
  
  String currentLine = "%2216%22,%20%2217%22"; 
  int str_len = currentLine.length() +1;
  Serial.println(str_len);
  char char_array[str_len];
  currentLine.toCharArray(char_array, str_len);
  
  Serial.println(currentLine);
  removestr(currentLine, "%22");
  Serial.println(currentLine);
  removestr(currentLine, "%20");
  Serial.println(currentLine);
  Serial.println("Das Ergebnis sollte 16,17 sein");
}

void loop() {}

Beim Kompilieren tritt der Fehler

sketch_sep11a:31:31: error: cannot convert 'arduino::String' to 'char*' for argument '1' to 'char* removestr(char*, const char*)'
   removestr(currentLine, "%22");
                               ^
sketch_sep11a:33:31: error: cannot convert 'arduino::String' to 'char*' for argument '1' to 'char* removestr(char*, const char*)'
   removestr(currentLine, "%20");

``` auf

:bomb: :bomb: :bomb:

Du weisst, das Dein String nicht geht. Warum verwendest Du nicht das, was Du gebaut hast?

...weil ich in meinem Hauptprogramm nunmal einen

  String currentLine = "%2216%22,%20%2217%22"; 

habe und keinen

char currentLine[] = "%2216%22,%20%2217%22";

Also muss ich es zuerst wandeln.

Solange auf dem Stack noch Platz für eine Arbeitskopie ist, würde dies funktionieren.

String currentLine = "%2216%22,%20%2217%22";

void removestr(String& aString, const char* str2Remove) {

  size_t len = aString.length();
  if (len == 0) return ;

  size_t len2Remove = strlen(str2Remove);
  if (len2Remove == 0) return;

  char str[len + 1];
  memcpy(str, aString.c_str(), len + 1);

  char *readFrom = str;
  char *foundAt;
  while ((foundAt = strstr(readFrom, str2Remove)) != NULL) {
    memmove(foundAt, foundAt + len2Remove, (readFrom + len) - (foundAt + len2Remove) + 1); // move the '\0' at the same time
    readFrom = foundAt;
    len -= len2Remove;
  }
  aString = str;
}

void setup()
{
  Serial.begin(115200);
  Serial.println(currentLine);

  removestr(currentLine, "%22");
  Serial.println(currentLine);

  removestr(currentLine, "%20");
  Serial.println(currentLine);

  Serial.println("Das Ergebnis sollte 16,17 sein");

}

void loop() {}

Was ist das?

  char char_array[str_len];
  currentLine.toCharArray(char_array, str_len);

Props an J-M-L Jackson.
Der einzige, der mir bisher helfen konnte und dabei nicht abwertend war!
Jetzt geht wieder alles. Danke!

Was erwartest du?

Aus:

Wie man dieses Forum benutzt - bitte lesen

Multipostings sind genau so unangenehm.

Wenn DU es als abwerten findest, das DU einen charArray baust und den nicht verwendest und den Hinweis:

Und den Hinweis:

nicht nutzt, dann ist alles verloren.

Na dann.
Es bleibt trotzdem eine Krücke für ein nicht hinken müssendes Bein.

Ist mir eigentlich egal, Hauptsache es funktioniert. Ich lerne gerne dazu, nur geht das nicht alles auf einmal.

Ja, das ist die richtige Einstellung, die Dich gehindert hat eine einfache Zeile zu editieren und mit dem zu füllen, was Du Dir vorgelegt hast.

  removestr(char_array, "%22");

Ja, das war dann auch die letzte Zeile, die ich Dir geschrieben habe.
Du willst ja lernen.

Manche Leute lernen, indem sie Hinweise und Anstöße bekommen, und sie nehmen es als persönliche Herausforderung, das Problem zu lösen, ohne mit einer Lösung gefüttert zu werden

Einige andere ziehen es vor, eine Lösung zu studieren, um ihre Fähigkeiten zu verbessern.

Solange Wissen erworben wird, bin ich mit allem einverstanden, was funktioniert.

1 Like

also ich saß heute bestimmt 5h dran und habe mir viel angeschaut. war dann trotzdem froh, dass mir jmd einen Tipp geben konnte. Ich bin eben kein Profi-Programmierer...