Hallo,
ich hab noch immer ein Leerzeichenproblem.
Wie kann man eine Eingabe ermöglichen in der Leerzeichen automatisch gelöscht werden?
Dario
Hallo,
ich hab noch immer ein Leerzeichenproblem.
Wie kann man eine Eingabe ermöglichen in der Leerzeichen automatisch gelöscht werden?
Dario
Hi Dario,
die syntax von fscanf erlaubt i.P. die Angabe von erlaubten oder nicht erlaubten Charactern. Das ist aber vermutlich nicht wirklich hilfreich. Besser machst Du eine Nachbearbeitung vom Eingabepuffer. Irgendwie so
char buffer[BUFLEN]; // der Eingabepuffer
char *c1, *c2; // zur Hilfe
…
Eingabe in den buffer lesen
// Leerzeichen in buffer eliminieren
c1 = c2 = buffer;
while (c2) //
{
if (c2!=’ ')
{
*c1 = *c2;
c1++;
}
c2++;
}
*c1=0;
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Da fehlte was
> char buffer[BUFLEN]; // der Eingabepuffer
> char \*c1, \*c2; // zur Hilfe
>
> ...
>
> Eingabe in den buffer lesen
>
> // Leerzeichen in buffer eliminieren
>
> c1 = c2 = buffer;
> while (c2) //
> {
> if ( **\*** c2!=' ')
> **{
> \*c1 = \*c2;
> c1++;
> }
> c2++;
> }
> \*c1=0;**
Der Kommentar ist noch falsch. Statt
// Leerzeichen in buffer eliminieren
muss es
// Leerzeichen im gesamten Hauptspeicher ignorieren
c1 = c2 = buffer;
while (c2) //
{
if ( * c2!=’ ')
{
*c1 = *c2;
c1++;
}
c2++;
}
*c1=0;
while( *c1=*c2++ ) if ( *c1 != ’ ’ ) ++c1;
Markus
Hi,
worauf willst Du hinaus? Mein von Peter korrekt korrigierter Code terminiert am Ende des Strings, weil strings in C mit 0 abgeschlossen werden. Deine Zeile terminiert in der Tat nicht am Stringende.
T
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
c1 = c2 = buffer;
while (c2) //
[…]
while( *c1=*c2++ ) if ( *c1 != ’ ’ ) ++c1;
Markus
Hi,
worauf willst Du hinaus? Mein von Peter korrekt korrigierter
Code terminiert am Ende des Strings, weil strings in C mit 0
abgeschlossen werden. Deine Zeile terminiert in der Tat nicht
am Stringende.
c1 und c2 sind Zeiger/Pointer, und verweisen auf eine Speicherzelle.
Wenn sie auf das Ende der Zeichenkette verweisen, dann zeigen sie auf eine Speicherzelle, die den Inhalt 0 hat. Der Zeiger ist dann aber nicht 0!
Beispiel:
char text[] = „“; // Leerstring
char* ptr = text;
ptr zeigt nun zwar auf das Ende der Zeichenkette, ist selbst aber nicht 0, stattdessen ist *ptr gleich 0.
Du kannst ja mal versuchen ptr auf 0 zu setzen:
ptr = 0;
und dann mit *ptr auf die Speicherzelle dahinter zuzugreifen.
Unter Windows wirst du dann eine Schutzverletzung erhalten, unter Linux/Unix wahrscheinlich einen core-dump.
Markus
Also jetzt bin ich verwirrt,
char buffer[BUFLEN]; will er schon nicht.
Da hab ich mal frech char buffer[10] verwendet und dann mal beide Varianten. Bei der ersten kackt er ab, bei der zweiten geht nix. Was hab ich verkehrt gemacht?
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Also jetzt bin ich verwirrt,
char buffer[BUFLEN]; will er schon nicht.
Da hab ich mal frech char buffer[10] verwendet und dann mal
beide Varianten. Bei der ersten kackt er ab, bei der zweiten
geht nix. Was hab ich verkehrt gemacht?
Sollte eigentlich funktionieren. Wenn du mal ein kleines Testprogramm oder zumindest einen größeren Codeausschnitt postest, kann ich dir vielleicht weiterhelfen.
Markus
Hallo seawolf, hier ein Testprogramm für Dich:
main()
{
char test[]=„Das ist ein Test“;
char *p1,*p2;
for (p1=p2=test;*p1=*p2;*p2++) {
if (*p1!=’ ')
p1++;
}
*p1=0;
printf("%s\n",test);
}
Grüsse Oli
void startbildschirm(){
char c;
clrscr();
…gibt verschiedenes Zeugs aus…
printf(">> Space");
c = getch();
if(c != ’ ')
startbildschirm();
}
dannach kommt das eigentliche Menü meines Programmes, wo dann unter Win98 das Leerzeichen aus diesem Fenster schon da ist…
Hallo,
Unter Windows wirst du dann eine Schutzverletzung erhalten,
unter Linux/Unix wahrscheinlich einen core-dump.
Nein. Unter Linux bekommst Du ein SIGSEGV. Windows stürzt vermutlich einfach nur ab
Gruß
Fritze
Ei Padauz - tatsaechlich noch’n Stern vergessen …
T
Da noch fehlte was
Hallo,
Also jetzt bin ich verwirrt,
char buffer[BUFLEN]; will er schon nicht.
Da fehlt vor Verwendung von BUFLEN noch etwas.
Da hab ich mal frech char buffer[10] verwendet und dann mal
beide Varianten.
Das hast du richtig gemacht.
Bei der ersten kackt er ab, bei der zweiten
geht nix. Was hab ich verkehrt gemacht?
Ich habe da leider noch einen kleinen Fehler übersehen:
#define BUFLEN 10
char buffer[BUFLEN]; // der Eingabepuffer
char *c1, *c2; // zur Hilfe…
Eingabe in den buffer lesen
// Leerzeichen in buffer eliminieren
c1 = c2 = buffer;
while ( * c2) //
{
if (*c2!=’ ') //
{
*c1 = *c2;
c1++;
}
c2++;
}
*c1=0;
Eigentlich sollte man
*c=’\0’;
verwenden. Es ist nicht zwingend vorgeschrieben, dass der Stringterminator in jedem Zeichensatz den Wert „0“ haben muss. ‚\0‘ ist aber immer als Stringende-Markierung definiert.
Sorry
Peter(TOO)