Terminiernde Null am Stringende löschen funktioniert nicht, warum?



  • #include...
    
    void strremove(char* source,char ch) {
             char* target=source;
             for (;(*target=*source)!=0;source++)
                     if (*target!=ch) target++;
     }
    
    int main ()
    {
      ...
      gets(PLAIN);
      strremove (PLAIN, '\0');
      ...
    }
    

    Meine Frage lautet nun, warum mit dem obigen Code die terminierende Null nicht aus meinem String verschwindet...



  • Weil sich die for-Schleife beendet, wenn sie auf die '\0
    ' trifft.



  • Mist...wenn ichs aber umschreibe, so, dass er die Null killt:

    #include <stdio.h>
    ...
    void strremove(char* source,char ch,int x) {
             char* target=source;
             int i;
             for (i=0;i<x;source++)
                     if (*target!=ch) target++;
     }
    
    int main(void)
    {
    
     ...
        gets(PLAIN);
        x = strlen(PLAIN);
    
        strremove(PLAIN, '\0',x);
        ...
    }
    

    dann hängt sich das Programm nach der Eingabe auf und springt nicht zur nächsen Anweisung....



  • Das Programm hängt sich nicht auf, das landet "nur" in einer Endlosschleife, weil du die Schleifenvariable i nicht veränderst.

    PS: Was für einen Sinn soll es denn haben, den String-Terminator zu löschen? Und gegen was willst du ihn letztendlich ersetzen?



  • char s[] = "hallo";
    s[strlen(s)] = 'O';
    

    Und jetzt 😕



  • Oi...ich sitz definitiv schon zu lange vor dem Rechner heut...

    Also das ganze soll ein -zugegebenermaßen sehr einfaches- Kryptoprogramm werden, und unser Prof hat bemängelt, das beim Verschlüsseln die \0 mit verschlüsselt wird... auch wenns eigentlich egal ist, da sie ja auch wieder mit entschlüsselt wir und somit wieder zu \0 wird.

    Hier der gesamte Quelltext:

    #include <stdio.h>
    #include <string.h>
    #define MASK 0x0f //Maske für die unteren 4 Bit eines Char
    
    void strremove(char* source,char ch,int x) {
             char* target=source;
             int i;
             for (i=0;i<x;source++,i++)
                     if (*target!=ch) target++;
     }
    
    int main(void)
    {
    
     char KEY[1000], PLAIN[1000], CRYPT[1000], DECRYPT[1000];
     int i,k,x,y;
    
        printf("\nBitte geben sie den Schluessel ein:\n");
        gets(KEY);
        printf("\nBitte geben sie den zu verschluesselnden Text ein:\n");
        gets(PLAIN);
        printf("\n");
        x = strlen(PLAIN);
        y = strlen(KEY);
        strremove(KEY,'\0',y);
        strremove(PLAIN, '\0',x);
        for (i = 0, k = 0; i < x; i++)
            {
                CRYPT[i] = (KEY[k] & MASK) ^ PLAIN[i];
                k++;
            if (k == y)
             k = 0;
          else;
         }
    
     printf("\nEncodierter Text: %s\n", CRYPT);
     DECRYPT[i] = 0;
     for (i = 0, k = 0; i < x; i++)
         {
          DECRYPT[i] = (KEY[k] & MASK) ^ CRYPT[i];
          k++;
          if (k == y)
             k = 0;
          else;
         }
     printf("\nDecodierter Text: %s\n", DECRYPT);
    return 0;
    }
    


  • cooky451 schrieb:

    char s[] = "hallo";
    s[strlen(s)] = 'O';
    

    Und jetzt 😕

    Mir ist grad nicht ganz klar, was das mit meinem Problem zu tun hat...



  • Dann bau halt ein if (bla[i] != '\0') { ... } ein. Warum so kompliziert? 🙄



  • strlen zählt die Anzahl der Zeichen bis zum String-Ende, also dem Null-Terminator...



  • Puschkin2004 schrieb:

    Oi...ich sitz definitiv schon zu lange vor dem Rechner heut...

    Also das ganze soll ein -zugegebenermaßen sehr einfaches- Kryptoprogramm werden, und unser Prof hat bemängelt, das beim Verschlüsseln die \0 mit verschlüsselt wird... auch wenns eigentlich egal ist, da sie ja auch wieder mit entschlüsselt wir und somit wieder zu \0 wird.

    Was soll denn damit gemeint sein? Die '\0' gilt in C als Stringende-Zeichen, das heißt wenn die nicht mit verschlüsselt werden soll, mußt du rechtzeitig vorher aufhören.

    Ansonsten hat deine strremove()-Funktion noch ein sehr gravierendes Problem - sie entfernt nichts aus dem übergebenen String.

    PS: Die Hilfsvariable k benötigst du auch nicht wirklich:

    for (i = 0; i < x; i++)
    {
      CRYPT[i] = (KEY[i%y] & MASK) ^ PLAIN[i];
    }
    

    (und ein else mit einer leeren Anweisung sieht einfach nur unnötig aus)


Anmelden zum Antworten