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