PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingabe ohne Leerzeichen und Satzzeichen ausgeben



cybercrow
05-12-2001, 20:03
Hi,
ich wollte gerade ein kleines C Programm schreiben, welches einen Satz einliest, alle Satz- Leerzeichen entfernt und ihn dann wieder ausgibt.

Das Programm läuft Problemlos, wenn man "normale" Sätze eingibt. Wenn man aber Sätz mit mehreren Leer- Satzzeichen hintereinander eingibt wird nur jedes zweite entfern (Bsp: Wenn ich ?!? eingebe wird ! noch ausgegeben).

Hier mein Programm:



#include <stdio.h>
#include <string.h>

int main()
{
char satz[80];
int laenge, i, j;

printf("\nGeben Sie einen Satz ein:\n>");
fgets(satz, sizeof(satz), stdin);
if(satz[strlen(satz)-1]=='\n')
satz[strlen(satz)-1]=='\0';
laenge = strlen(satz);
for(i=0; i<=laenge; i++) {
if(satz[i]==' ' || satz[i]=='.' || satz[i]==',' || satz[i]=='!' || satz[i]=='?') {
laenge--;
for(j=i; j<=laenge; j++)
satz[j] = satz[j+1];
}
}

printf("\n%s\n", satz);

return 0;
}


Es wird wahrscheinlich irgendwas in der for Schleife nicht richtig laufen. Ich komme aber nicht drauf, wo das Problem liegt.

Kann mir jemand auf die Sprünge helfen?

Danke!

thommy
06-12-2001, 08:21
Nur der relevante Teil:

laenge = strlen(satz);
for(i=0, j=0; i<laenge; i++) {
if(satz[i]==' ' || satz[i]=='.' || satz[i]==',' || satz[i]=='!' || satz[i]=='?')
continue;
satz[j++] = satz[i];
}
satz[j]=0;

fgets schließt die Zeichenkette übrigens selbst mit 0 ab.


Hier mal eine andere Lösung:

#include <stdio.h>
#include <string.h>

int main()
{
char satz[255];
char* pointer = &satz[0];
printf("Geben Sie einen Satz ein: ");
fgets(satz, sizeof(satz), stdin);

while (*pointer)
{
switch (*pointer)
{
case ' ':
case '\t':
case '?':
case '.':
case '!':
case ':':
case ';':
break;
default:
printf("%c", *pointer);
}
pointer++;
}
return 0;
}

Viel Spaß
Thomas

cybercrow
06-12-2001, 16:06
Hi thommy,


Original geschrieben von thommy

fgets schließt die Zeichenkette übrigens selbst mit 0 ab.


ja, nur leider schliesst fgets die Zeichenkette nicht nur mit \0 sondern mit \n\0 ab. Dadurch erhalte ich z.B. wenn ich mit strlen() die Länge einer Zeichenkette bestimme die tatsächliche Länge + 1.
Deshalb habe ich noch ein:
if(satz[strlen(satz)-1] == '\n') satz[strlen(satz)-1]='\0';

eingefügt.

Zur deiner "anderen Lösung". So wird es auch in meinem Buch gelöst. Ich wollte es aber so lösen das die änderung nicht nur auf dem Bildschirm ausgegeben wird sondern in der Variablen durchgeführt wird. Habe mittlerweile auch schon eine eigene Lösung gefunden:


/* aufg036.c */

#include <stdio.h>
#include <string.h>

int main()
{
char satz[80];
int laenge, i=0, j;

printf("\nGeben Sie einen Satz ein:\n>");
fgets(satz, sizeof(satz), stdin);
if(satz[strlen(satz)-1]=='\n')
satz[strlen(satz)-1]=='\0';
laenge = strlen(satz);
while(satz[i]) {
if(satz[i]==' ' || satz[i]=='.' || satz[i]==',' || satz[i]=='!' || satz[i]=='?') {
laenge--;
for(j=i; j<=laenge; j++)
satz[j] = satz[j+1];
} else
i++;
}

printf("\n%s\n", satz);

return 0;
}

anda_skoa
06-12-2001, 17:20
Das Problem im Original Besipiel war, dass i in jedem Schleifendurchlauf erhöht wurde, auch dann, wenn ein Zeichen entfernt wurde.

Was dann praktisch einen Indexerhöhung um 2 bedeutet.

Ciao,
_