Probeklausurenaufgabe2



  • 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