Probeklausurenaufgabe2



  • Hallo ihr lieben,
    noch eine Aufgabe zu dem thema.
    Schreiben Sie eine Funktion rtrim; Die Funktion soll von einem übergebenen
    char-Array alle Leerzeichen am Ende entfernen.

    also z.B.: [H][A][L][L][O][][][][][][][\0]
    zu [H][A][L][L][O][\0]

    habs mir wie folgt gedacht:
    ( nur Funktion ist wichtig, hab mir aber noch schnell das main zur
    Überprüfung gemacht, will aber nicht so wie ich mir das vorstelle )

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void rtrim(char s[]){
    
    int lenght = 0;
    lenght = strlen(s)-1;
    int i = 0;
    for(i=lenght;i>0;i--){
     if(s[i]==32)
      {s[i]=='\0';}
    
    else if (s[i]!=32)
    {break;}   
    
    }
    
    int main(){
    
    char feld[10];
    printf("Geben Sie ihr Wort ein:\n");
    scanf("%s",&feld);
    rtrim(feld);
    printf("%s", feld);
    system("Pause");
    return 0;    
    
    }
    


  • In Zeile 32 willst du zuweisen, nicht vergleichen, schreib

    s[i]='\0'
    


  • HinzundKunz schrieb:

    Hallo ihr lieben,
    noch eine Aufgabe zu dem thema.
    Schreiben Sie eine Funktion rtrim; Die Funktion soll von einem übergebenen
    char-Array alle Leerzeichen am Ende entfernen.

    also z.B.: [H][A][L][L][O][][][][][][][\0]
    zu [H][A][L][L][O][\0]

    habs mir wie folgt gedacht:
    ( nur Funktion ist wichtig, hab mir aber noch schnell das main zur
    Überprüfung gemacht, will aber nicht so wie ich mir das vorstelle )

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void rtrim(char s[]){
    
    int lenght = 0;
    lenght = strlen(s)-1;
    int i = 0;
    for(i=lenght;i>0;i--){
     if(s[i]==32)
      {s[i]=='\0';}
     
    else if (s[i]!=32)
    {break;}   
    
    }
    
    int main(){
    
    char feld[10];
    printf("Geben Sie ihr Wort ein:\n");
    scanf("%s",&feld);
    rtrim(feld);
    printf("%s", feld);
    system("Pause");
    return 0;    
        
        
        
    }
    

    Außerdem:

    lenght = strlen(s)-1;
    

    Ich denke, dass das -1 nicht notwendig ist, da strlen ohnehin nur bis zum \0 zählt und es also nicht mehr enthalten ist. Du ignorierst also du die Subtraktion vermutlich das letzte Zeichen. Beispiel:
    [A][B][C][ ][\0]
    Länge: 4 Aber du subtrahierst noch 1 => Länge: 3
    Problem: Letztes Zeichen wird nicht mehr bearbeitet.



  • Wobei ich da eventuell ein Logikfehler entdecke. Warum gehst du rückwärts durch den String? Wenn du alle Leerzeichen hinter dem String entfernen willst, soltest du von links nach rechts vorgehen und beim ersen Auftreten eines Leerzeichens dieses durch \0 ersetzen. Fertig.



  • läklöä schrieb:

    Wobei ich da eventuell ein Logikfehler entdecke. Warum gehst du rückwärts durch den String? Wenn du alle Leerzeichen hinter dem String entfernen willst, soltest du von links nach rechts vorgehen und beim ersen Auftreten eines Leerzeichens dieses durch \0 ersetzen. Fertig.

    Ist schwachsinn. Mein Fehler, dein Ansatz ist soweit okay 👍



  • Wäre nett wenn du uns sagst was nicht funktioniert.

    In deine rtrim-Funktion geht eine geschweifte Klammer mehr auf als zu, sowas sieht man mit einer ordentlichen Einrückung.

    scanf("%s",&feld); tut nicht was du willst. Es ließt nämlich nur ein Wort, ohne Leerzeichen am Ende. Mal abgesehen davon dass du hier einen Pufferüberlauf provozierst.



  • Ich hätte es so gemacht:

    #include <stdio.h>
    #include <string.h>
    
    #define BUF_SIZE (256)
    
    void rtrim(char *arr);
    
    int main()
    {
    	char buf[BUF_SIZE];
    
    	printf("Eingabe: ");
    
    	fgets(buf, BUF_SIZE, stdin);
    
    	rtrim(buf);
    
    	printf("Nachher: '%s'", buf);
    }
    
    void rtrim(char *arr)
    {
    	unsigned int i, len = strlen(arr) - 1;
    
    	for (i = len; i > 0; --i)
    	{
    		if (arr[i] != ' ' && arr[i] != '\n')
    		{
    			break;
    		}
    
    		arr[i] = '\0';
    	}
    }
    


  • oder machst du so:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    void rtrim (char *in, char *out)
    {
       char *other = 0;
       while (*in)
       {
          *out = *in++;
          if (!isspace (*out))  // letztes nicht-space merken
             other = out;
          out++;
       }
       if (other)
          *(other+1) = 0;       // wenn eins da war, dann hier ende
       else
          *out = 0;             // es gab nur spaces
    }
    
    int main()
    {
       char *in = "     hello world     ";
       char out[256];
       rtrim (in, out);
       printf ("%d %s\n%d %s\n", strlen (in), in, strlen (out), out);
    }
    

    ^^ ist ja immer gut, wenn man input und output trennen kann.
    🙂



  • Ich würde das flexibel machen:

    void rtrim(char *arr, char c); // c wegtrimmen.
    


  • Big Brother schrieb:

    Ich würde das flexibel machen:

    void rtrim(char *arr, char c); // c wegtrimmen.
    

    wenn, dann mach aus 'c' einen string von allen zeichen, die rechts weg sollen.
    🙂



  • ;fricky schrieb:

    Big Brother schrieb:

    Ich würde das flexibel machen:

    void rtrim(char *arr, char c); // c wegtrimmen.
    

    wenn, dann mach aus 'c' einen string von allen zeichen, die rechts weg sollen.
    🙂

    Doch warum funktioniert bei diesem Code dann das Löschen nicht mehr? Ich bin ratlos:

    #include <stdio.h>
    #include <string.h>
    
    #define BUF_SIZE (256)
    
    void rtrim(char *arr, char *c);
    
    int main()
    {
    	char buf[BUF_SIZE];
    	char chars[3];
    
    	printf("Eingabe: ");
    
    	fgets(buf, BUF_SIZE, stdin);
    
    	chars[0] = '\n';
    	chars[1] = ' ';
    	chars[2] = '\0';
    
    	rtrim(buf, chars);
    
    	printf("Nachher: '%s'", buf);
    }
    
    void rtrim(char *arr, char *c)
    {
    	unsigned int i, j, len = strlen(arr) - 1, lenc = strlen(c);
    
    	for (i = len; i > 0; --i)
    	{
    		for (j = 0; j < lenc; ++j)
    		{
    			if (arr[i] != c[j])
    			{
    				return;
    			}
    		}
    
    		arr[i] = '\0';
    	}
    }
    


  • dann versuch mal so:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int has_one_of (char c, char *list)  // zeichen suchen
    {
       while (*list)
       {
          if (c == *list)
             return 1;
          list++;
       }
       return 0;
    }
    
    void rtrim (char *in, char *out, char *trim)
    {
       char *other = 0;
       while (*in)
       {
          *out = *in++;
          if (!has_one_of (*out, trim))  // letztes gueltiges zeichen merken
             other = out;
          out++;
       }
       if (other)
          *(other+1) = 0;       // wenn eins da war, dann hier ende
       else
          *out = 0;             // war keins da
    }
    
    int main()
    {
       char *in = "     hello world321123";
       char out[256];
       rtrim (in, out, "123");
       printf ("%d %s\n%d %s\n", strlen (in), in, strlen (out), out);
    }
    

    🙂



  • Aber was ist an meinem Code verkehrt?



  • ;fricky schrieb:

    Big Brother schrieb:

    Ich würde das flexibel machen:

    void rtrim(char *arr, char c); // c wegtrimmen.
    

    wenn, dann mach aus 'c' einen string von allen zeichen, die rechts weg sollen.
    🙂

    Jepp. Hier wäre wohl doch besser, keinen Parameter zu übergeben und isspace zu nehmen, das erkennt ja auch '\n', Leerzeichen und den ganzen anderen whitespace Kram.

    sdfsdf schrieb:

    Doch warum funktioniert bei diesem Code dann das Löschen nicht mehr? Ich bin ratlos:

    Weil du dein return fehlplaziert hast. Achja und chars[2] = '\0'; ist überflüssig.
    Hier deine Version, überarbeitet:

    void rtrim(char *arr, char *c) { 
        unsigned int i, j, len = strlen(arr) - 1, lenc = strlen(c); 
        for ( i = len; i > 0; i-- ) { 
            for ( j = 0; j < lenc; j++ ) 
    			if (arr[i] == c[j]) break; 
            if ( j < lenc )	arr[i] = '\0'; 
    		else return;
        } 
    }
    


  • danke für die vielen Antworten, gleich mal durchgehen 😛


Anmelden zum Antworten