Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Eingabe ohne Leerzeichen und Satzzeichen ausgeben

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.04.2001
    Beiträge
    159

    Question Eingabe ohne Leerzeichen und Satzzeichen ausgeben

    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:

    Code:
    #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!

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.10.1999
    Ort
    Dresden
    Beiträge
    255
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.04.2001
    Beiträge
    159
    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:

    Code:
    /* 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;
    }

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •