Also ich kapiere es einfach nicht. Ich habe einen Straßennamen mit Hausnummer, die in 'strasse[30]' gespeichert sind. Dort sind aber Leerzeichen enthalten, die ich durch "%20" ersetzen muss. Bei der Überprüfung gibt's Mecker .
// in der Deklaration
char strasse[30]="";
// Subroutine
void leerErsetzen()
{
int zaehler = 0;
while (zaehler < 31)
{
if (strasse[zaehler] == " ") { // hier Fehlermeldung: ISO C++ forbids comparison between pointer and integer
strasse[zaehler]="%20"; }
zaehler++;
}
}
Ich verstehe einfach die Fehlermeldung nicht und weiß deshalb nicht was ich machen soll.
Gruß Eberhard
Bei " " handelt es sich um einen Nullterminierten String. C behandelt diese mit einem Zeiger auf den ersten Character, darum "pointer". strasse[zaehler] ist hingegen nur ein Element aus dem Char-Array, also ein einzelner char, der wie ein Integer behandelt wird, darum Vergleich mit "integer". Für einzelne chars nimmt man die einfachen Anführungszeichen ' statt den doppelten. Wenn du also if (strasse[zaehler] == ' ') schreibst, sollte es - hier zumindest - keinen Fehler mehr geben.
Das gleiche Problem gibt es aber in der nächsten Zeile: "%20" ist wieder eine Zeichenkette (4 byte), die du in ein Element deines Arrays speichern willst. Da ist aber nur Platz für ein char, also ein byte. Ich weiß nicht genau, was %20 heißen soll, wenn es der Hexadezimalwert 0x20 sein soll, dann schreib einfach strasse[zaehler]=0x20; .
"%20" ist der URL-Code für ein Leerzeichen.
Da in einem URL keine Leerzeichen vorkommen dürfen, wurde eine s.g. Prozentkodierung erdacht, die solche Zeichen dann
wieder (für den Webserver) verwertbar macht.
Das im String in situ zu ersetzen ist recht kompliziert. Dadurch, dass du man mehr Zeichen einfügen muss, muss dass Array größer werden und man muss Daten verschieben. Wenn das ein Puffer ist der größer als der String ist, ist es dagegen einfach. Dann könnte man einfach memmove() verwenden um den hinteren Teil-String weiter nach rechts zu schieben (inkl. Null-Terminator!!). Und strcpy() um den neuen String einzufügen.
Ansonsten müsste man ein neues Array dynamisch anlegen und dann wieder strcpy() verwenden um die Teil-Strings zu kopieren.
Es wäre wesentlich einfacher man gibt erst den den Teil des Strings bis zum Leerzeichen aus. Sendet dann das "%20" extra und macht dann mit dem Rest des Strings weiter. Ohne das Array wirklich zu verändern. Es gibt überladene Version von write() bei denen man die Länge mit angibt:
Ich habe es schnell gemerkt, dass ich nur das letzte Zeichen von %20 in den Speicher schieben kann. Also habe ich einen zweiten (größeren) Speicherbereich aufgemacht, in den Zeichen für Zeichen geschoben wird. Bei einem Leerzeichen werden halt drei Zeichen "eingelagert".
Und was sag' ich -- es funktioniert! Vielleicht ein wenig umständlich, aber für mich als Anfänger zufriedenstellend. Wenn es deutlich elegantere Lösungen gibt, her damit. Man muss bedenken, dass mal ein Leerzeichen und ein anderes mal zwei oder mehr Leerzeichen auftreten können. Wie das bei Straßennamen nun mal so ist. U.a. hängt es auch vom empfangenen Muster der Adresse ab. Ich hatte eine Straßenbezeichnung, in der zwischen Straße und Hausnummer zwei Leerzeichen waren. Also muss eine Lösung alle Leerzeichen varabel erkennen.
Danke an alle, die sich hier beteilt haben.
Gruß
Eberhard
Da es mehrere Leerzeichen sein können ist es so vielleicht noch am besten. Das geht zwar auch mit fertigen Funktionen, aber dann müsste man wieder mehrmals drüber laufen damit man alle Leerzeichen bearbeitet....