Forum: PC-Programmierung Stringteilung in C


von M. V. (bmtil)


Lesenswert?

Hallo, ich hab ein kleines Problem.
Im folgendem Programmstueckchen sollen Strings (als str_in bezeichnet) 
nach einem Leerezeichen durchsucht werden und an der Stelle von diesem 
in str_1 und str_2 geteilt werden.
Das Problem ist, ich weiss nicht wie ich die Abbruchbedinung formulieren 
soll, falls in dem str_in kein Leerzeichen vorhanden ist.
Hier ist der Code:
1
char str_in[10];
2
char str_1 [10];
3
char str_2  [10];
4
5
6
void subset()
7
{  
8
  char index_in, index_out;
9
  
10
  index_in = 0;
11
  index_out = 0;
12
  
13
  while (str_in[index_in] != 0x20 && str_in[index_in]==0)
14
  {
15
    str_1[index_out] = str_in[index_in];
16
    index_in++;
17
    index_out++;
18
  }
19
  
20
  index_out = 0;
21
  
22
  while (str_in[index_in] != 0x0A && str_in[index_in] != 0x0D)
23
  {
24
    str_2[index_out] = str_in[index_in];
25
    index_in++;
26
    index_out++;
27
     }
28
   
29
}

von Bedingung (Gast)


Lesenswert?

In beiden Schleifen "&& index_in <= 9" hinzufuegen

MfG

von HP (Gast)


Lesenswert?

ist der String 0-Terminiert? Wenn ja, wäre das deine Abbruchbedingung. 
ansonsten kannst du ja nach der maximalen Länge des Stings (hier 10) 
abbrechen. Weiter darfst du ohnehin nicht gehen

von M. V. (bmtil)


Lesenswert?

Bedingung schrieb:
> In beiden Schleifen "&& index_in <= 9" hinzufuegen
>
> MfG

Das funktioniert leider nicht.
Ich sollte noch erwaehnen dass ich mit Strings von unbestimmter Länge 
arbeite.

von (Ein) (Gast)


Lesenswert?

Du könntest es auch mit index() und strtok() etc. probieren. Oder 
einfach auf '\0' prüfen, das ist das Ende des Strings (siehe Beitrag von 
HP)...

von M. V. (bmtil)


Lesenswert?

Enmtschuldigung für den Doppelpost,
das war doch die Lösung, ich hab bloss bei der Variablen Deklaration die 
eckigen Klammern vergessen,
Vielen dank.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

mjam, Spielchen :-)

mal eben schnell runtercodiert, sollte funktionieren:
1
#define TOKEN     ' '
2
#define MAX_STR    16
3
4
int Tokenizer(char *str, char **dest, char token)
5
{
6
  unsigned int cnt=0, i=0;
7
8
  if(!str || !dest) return(-1);
9
10
  do {
11
    i++;
12
    if(*str == token) {
13
      dest[cnt] = (char *) malloc ((i * sizeof(char)) +1);
14
      memcpy(dest[cnt], str-(i-1), (i-1));
15
      dest[cnt++][(i-1)] = 0;
16
      if(cnt > (MAX_STR-1)) return(-1);
17
      i=0;
18
    }
19
  } while(*str++);
20
21
  if(cnt > (MAX_STR-1)) return(-1);
22
  dest[cnt] = (char *) malloc ((i * sizeof(char)) +1);
23
  memcpy(dest[cnt], str-i, i);
24
  dest[cnt++][i] = 0;
25
26
  return(cnt);
27
}
28
29
30
int main()
31
{
32
  char *str = "Hallo, Welt. Dies ist ein Test zum Tokenizer.";
33
  char *dest[MAX_STR];
34
  int strs;
35
  
36
  strs = Tokenizer(str, dest, TOKEN);
37
}

Viel Spass damit!

von Mark B. (markbrandis)


Lesenswert?

Random ... schrieb:
> mal eben schnell runtercodiert, sollte funktionieren

Tut es :-)
Eine Ausgabe mit
1
  printf("str = %s\n", str);
2
  
3
  for(i=0; i<strs; i++)
4
  printf("dest[%d] = %s\n", i, dest[i]);

ergibt:

str = Hallo, Welt. Dies ist ein Test zum Tokenizer.
dest[0] = Hallo,
dest[1] = Welt.
dest[2] = Dies
dest[3] = ist
dest[4] = ein
dest[5] = Test
dest[6] = zum
dest[7] = Tokenizer.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

:-)

vergesst das free() nicht, wenn's nicht mehr gebraucht wird, oder ein 
neuer String zerlegt werden soll, sonst gibtz memory leaks :-)
1
int i;
2
for(i=0; i<strs; i++) {
3
  free(dest[i]);
4
}

von Raff (Gast)


Lesenswert?

versuchs mal damit:
1
/* ------------------------------------------------------------------------- *
2
 * Splits up string into tokens                                              *
3
 * ------------------------------------------------------------------------- */
4
static __inline__ void strtokenize(char *p, int *argc, char *argv[]) {
5
6
  for(*argc = 0;;) {
7
8
    /* skip all spaces and tabstops */
9
    while(*p == ' ' || *p == '\t')
10
      *p++ = '\0'; /* set them to zero */
11
12
    /* if string terminator occurs, we got no more tokens */
13
    if(*p == '\0') break;
14
15
    if(*p == ':') {
16
      /* the rest is a single argument
17
         can include blanks also */
18
      argv[(*argc)++] = p + 1;
19
      break;
20
    } else {
21
      /* add to argv list */
22
      argv[(*argc)++] = p;
23
24
      /* we reached maximal size of argv array */
25
      if(*argc == MAXARGS) break;
26
27
      /* scan for end of string, either ' ' or '\0' */
28
      while(*p != ' ' && *p != '\0')
29
        p++;
30
    }
31
  }
32
33
  /* null terminate argv list */
34
  argv[*argc] = NULL;
35
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.