Methode, die mehrere '\t' durch ein ' ' ersetzt
-
Hallo,
ich soll eine Methode schreiben: int convert(char *str)
die z.B ein Wort : ha (hier sin mehrere \t oder ' ')ll o (\t..) We lt ,-------> 'ha ll o We lt'
umwandelt bzw. verschiebt.
Allerdings sind man am Methodenkopf schon, dass da ein int zurückgegeben werden muss. Wir sollen also ein Wort, dass aus mehreren Tabs ('\t') oder mehrere Leerzeiche (' ') besteht, durch ein Leerzeichen ersetzen (' '). Wir sollten den String mit Hilfe von Zeigern "irgendwie" verschieben und die dann durch ' ' ersetzen, allerdings verstehe ich nicht genau, wie ich das machen soll. Dies hier ist mein Programm, es funktioniert, allerdings nur mit "printf". Wie kriege ich das so hin, dass ich nur mit Zeigern arbeite?Es geht hier speziell um die Zeilen 17 und 18, wie ich dies ohne printf bzw. mit zeigern einfach zuweise.
#include <stdio.h> #include <stdlib.h> #include <string.h> int convert(char *str){ int i; int count=1; for(i=0; i<=strlen(str);i++) { if (str[i]==' ' || str[i]=='\t') { count++; } else{ if(count==1){count=0;} if(count>1){printf("%c", ' ');} printf("%c", str[i]); count=1; } } return count; } int main(void){ printf("%d", convert("ha ll o We lt")); return 0; }
-
probier dies:
void conv (char *p) { char *q = p; for (;*p;p++) { if (*p == '\t') *p = ' '; if (!isspace(*p) || !isspace(*(p+1))) *q++ = *p; } *q = 0; } ... char s[] = "a \tb\t\tc d\t e"; conv (s); printf ("%s\n", s); ...
-
Danke!!
@Pointerfreak!
Du machst ja deinem Namen alle Ehre !
-
Hallo nochmal Pointerfreak, ich muss diese Methode mit einem "int" schreiben, welches auch ein int zurückgeben muss. Müsste man da nicht dann noch ein counter oder hinzufügen?
Und habe das ohne isspace probiert, allerdings funzt das dann nicht korrekt. Gibt es eine alterntive zu isspace?
-
pronix_2008 schrieb:
Hallo nochmal Pointerfreak, ich muss diese Methode mit einem "int" schreiben, welches auch ein int zurückgeben muss. Müsste man da nicht dann noch ein counter oder hinzufügen?
vielleicht return p-q; ?
pronix_2008 schrieb:
Und habe das ohne isspace probiert, allerdings funzt das dann nicht korrekt. Gibt es eine alterntive zu isspace?
etwa sowas:
#define isspace(c) ((c)==' ' || (c)== '\t')
-
etwa sowas:
#define isspace(c) ((c)==' ' || (c)== '\t')
Ich meine damit, ob es ganz ohne isspace() geht.
Ich habe probiert:if (*p!=' ' ||(*(p+1))!=' ')
Allerdings funktioniert das Programm dann ncht korrekt!
-
Okay, habe es hinbekommen:
if (!(*p==' ' || *p== '\t') || !((*(p+1))==' ' ||(*(p+1))=='\t'))
Allerdings verstehe ich nicht wieso man das nicht auch so schreiben kann:
if ((*p!=' ' || *p!= '\t') || ((*(p+1))!=' ' ||(*(p+1))!='\t'))
Ist das nicht eigentich das selbe?
und wozu ist in Zeile 17 :
*q = 0; ??
-
pronix_2008 schrieb:
Okay, habe es hinbekommen:
if (!(*p==' ' || *p== '\t') || !((*(p+1))==' ' ||(*(p+1))=='\t'))
Allerdings verstehe ich nicht wieso man das nicht auch so schreiben kann:
if ((*p!=' ' || *p!= '\t') || ((*(p+1))!=' ' ||(*(p+1))!='\t'))
Ist das nicht eigentich das selbe?
ne, das erste entspricht: (a ≠ b ∧ a ≠ c) ∨ (d ≠ b ∧ d ≠ c)
und das andere: a ≠ b ∨ a ≠ c ∨ d ≠ b ∨ d ≠ cpronix_2008 schrieb:
und wozu ist in Zeile 17 :
*q = 0; ??damit der string ein ende hat, sonst hängen die reste des ursprungs-strings noch mit drin.