You are not logged in.


Coolbininet

Neuer Clubber

  • "Coolbininet" started this thread

Posts: 4

Location: Österreich

Occupation: Student

  • Send private message

1

Tuesday, December 13th 2005, 9:10am

Text-Array in C zerschneiden?

Hallo Leute!

Wie schaffe ich es in C, dass ich aus einem Vorgabetext-Array nur Wörter in ein zweites Array schreiben kann?

erstes_array: Heute ist Montag, der 25. September 2005. Das ist ein schöner Tag!

Ich bräuchte jetzt die 10 Wörter über eine Schleife ausgewertet, dass im ersten Durchlauf nur "Heute" in ein Array geschrieben wird, im zweiten Durchlauf nur "ist" im gleichen Array steht usw. Es dürfen keine Zahlen als Wort erkannt werden, wie mache ich das?

Wende mich in meiner verzweifelsten Stunde an Euch *gg*!

Grüsse und Danke im Vorraus!

Coolbininet

Coolbininet

Neuer Clubber

  • "Coolbininet" started this thread

Posts: 4

Location: Österreich

Occupation: Student

  • Send private message

2

Tuesday, December 13th 2005, 9:33am

RE: Text-Array in C zerschneiden?

Mit folgendem Code kann ich einmal das erste Wort, aber da werden Zahlen auch mit geschnitten und als wort gezählt, brauche jetzt noch eine Wiederholung und eine Schnittstelle, wo ich die Wörter ausgeben kann!

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>

int main ()
{
char textarray[100]="Heute Montag, der 14. Dezember 2004 ist ein guter Tag!";
int zeichen=0;
int j, i, l=0, laenge, positionleer=0;
laenge=strlen(textarray);
		for (j=0; j<laenge; j++)
		{
			zeichen=textarray[j];
				if (zeichen==32)
				{
					for (i=positionleer; i<=laenge; i++)
					{
						textarray[l]=textarray[i+1];				
						l++;
					}
				}
				positionleer++;
		}
		printf("%s\n", textarray);	
	return 0;
}


Grüsse Coolbininet

Jockel

Ehrenmitglied mit Auszeichnung

Posts: 3,222

Location: 5<<0xE|5<<6|5>>2<<4

  • Send private message

3

Tuesday, December 13th 2005, 9:54am

Hallo!

Hier ein Code, der ein variabel langen String in Teilstrings zerlegt (anhand von Leerzeichen). Das Problem ist mit Sicherheit auch eleganter zu lösen, ich habs jetzt einfach mal fix hingekritzelt. Es werden keinerlei Fehlerüberprüfungen durchgeführt noch irgendwelche Prüfungen des Eingabestrings - also so ist die Lösung NICHT produktiv einsetzbar - aber ein Anhaltspunkt allemal.

Nach dem Durchlauf hast du den zerlegten String komplett in dem 2-dim Array z.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
   int i = 0;

   char a1[] = "Dies ist ein String, der in viele Einzelstrings zerlegt werden soll!";
   char **z = NULL;
   char* sta = a1;
   int idx = 0;

   // Alle Teilstrings von a1 bis ausschließlich "Tag!"
   for( i = 0; i < strlen( a1 ); i++ ) {
      if( a1[ i ] == ' ' ) {
         z = ( char** )realloc( z, ( idx + 1 ) * sizeof( char** ) );
         z[ idx ]  = ( char* )malloc( a1 + i - sta + 1 );
         memset( z[ idx ], 0, a1 + i - sta + 1 );
         strncpy( z[ idx ], sta, a1 + i - sta );
         sta = a1 + i + 1;
         idx++;
         i++;
      }
   }

   // Jetzt noch der letzte String, dem ja kein Leerzeichen folgt
   z = ( char** )realloc( z, ( idx + 1 ) * sizeof( char** ) );
   z[ idx ] = ( char* )malloc( strlen( a1 ) + 1 );
   strncpy( z[ idx ], sta, strlen( a1 ) + 1 );

   // Ausgeben und freigeben
   for( i = 0; i <= idx ; i++ ) {
      printf( "String #%i: %s (%i)\n", i, z[ i ], strlen( z[ i ] ) );
      free( z[ i ] );
   }

  free( z );

   return 0;
}


mfg

Jockel
P = NP.

Jockel

Ehrenmitglied mit Auszeichnung

Posts: 3,222

Location: 5<<0xE|5<<6|5>>2<<4

  • Send private message

4

Tuesday, December 13th 2005, 10:12am

Hallo!

Zweite Lösung:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
   char str[] = "Dieser String soll zerteilt werden! Dieser String soll zerteilt werden! 1 2 3 4 5";
   char* pos = str;
   char* nspace = NULL;
   char** z = NULL;
   int idx = 0;

   int i;

   while( ( nspace = index( pos, ' ' ) ) ) {
      z = ( char** )realloc( z, ( idx + 1 ) * sizeof( char** ) );
      z[ idx ] = ( char* )malloc( nspace - pos + 1 );
      memset( z[ idx ], 0, nspace - pos + 1 );
      strncpy( z[ idx ], pos, nspace - pos );

      idx++;
      pos = nspace + 1;
   }
   z[ idx ] = ( char* )malloc( strlen( pos ) + 1 );
   strncpy( z[ idx ], pos, strlen( pos ) + 1 );

   for( i = 0; i <= idx; i++ ) {
      printf( "String #%i: %s (%i)\n", i, z[ i ], strlen( z[ i ] ) );
      free( z[ i ] );
   }

   free( z );

   return 0;
}


Das mit der Zahlenprüfung sollte nicht weiter aufwendig sein.

mfg

Jockel
P = NP.

Coolbininet

Neuer Clubber

  • "Coolbininet" started this thread

Posts: 4

Location: Österreich

Occupation: Student

  • Send private message

5

Tuesday, December 13th 2005, 10:14am

Meine Lösung? - Warum geht das nicht richtig?

Hallo, warum wiederholt sich meine Lösung nicht bis zum letzten und wo kann ich hier die Strings ausgeben?

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>

int main ()
{
char textarray[100]="Heute Montag, der 14. Dezember 2004 ist ein guter Tag!";
int zeichen=0;
int j, i, l=0, laenge, positionleer=0;
laenge=strlen(textarray);
printf ("%d", laenge);
		for (j=0; j<laenge; j++)
		{
			zeichen=textarray[j];
				if (zeichen==32)
				{
					for (i=positionleer; i<=laenge; i++)
					{
						textarray[l]=textarray[i+1];				
						l++;
					}
				}
				positionleer++;
				laenge=strlen(textarray);
		}
		printf("%s\n", textarray);	
		printf ("%d", laenge);
		return 0;
}


Grüsse Coolbininet

Jockel

Ehrenmitglied mit Auszeichnung

Posts: 3,222

Location: 5<<0xE|5<<6|5>>2<<4

  • Send private message

6

Tuesday, December 13th 2005, 10:17am

Hallo!

Warum liest du nicht meine Lösung? Da wird der String zerteilt. Wie du dann mit den Einzelstring umgehst, ob du sie ignorierst (zb Zahlen) etc. das ist dann nur noch eine kleine Erweiterung. Und in meinem Fall kommt auch der letzte String mit ins Array.

mfg

Jockel
P = NP.

Coolbininet

Neuer Clubber

  • "Coolbininet" started this thread

Posts: 4

Location: Österreich

Occupation: Student

  • Send private message

7

Tuesday, December 13th 2005, 12:14pm

Erklärung!

Danke für deine Antwort Jockel!

Kurze Erklärung: Da ich dein Programm leider nicht verstehe, gerade aber beim Lernen bin und den Code nicht auswendig lernen will. Ich sehe das passende Ergebnis für meine Situatuion herauskommt. Aber für mich zum Lernen ist es besser meine Denkkonzepte weiterzuentwickeln und abzuschliessen. Dann kann ich mir deine Lösung zu Gemüte führen!

Grüsse

Coolbininet

Jockel

Ehrenmitglied mit Auszeichnung

Posts: 3,222

Location: 5<<0xE|5<<6|5>>2<<4

  • Send private message

8

Tuesday, December 13th 2005, 12:35pm

Aha - dann lern mal schön...
P = NP.

9

Tuesday, December 13th 2005, 1:24pm

@Coolbininet: Hier mal ein nicht super elegant formulierter Lösungsansatz:

Versuch einfach mal, Dir Deinen zu zerteilenden String bildlich im Hauptspeicher vorzustellen. Der String besteht aus allen aufeinanderfolgenden Zeichen Deines Strings, wobei das jeweilige Zeichen durch ein char repräsentiert wird. Im Anschluß an den String steht ein sog. Nullbyte ('\0') als Markierung für das Ende des Strings (= char-Array).

Wenn Du Deinen String in Einzelteile zerlegen willst, kannst Du folgendes machen.
- Erstmal die Anfangsadresse Deines Strings merken.
- Den "Ende-Marker" Deines ursprünglichen Strings merken.
- Leerzeichen in Deinem String durch Nullbytes ersetzen.
- Vom Anfang Deines Strings durchhangeln bis zum Ende. Dabei ist der Bereich zwischen zwei Nullbytes jeweils ein eigenständiger String, den Du über Zeiger ansprechen und somit auch kopieren / verändern kannst.

Klingt vielleicht etwas konfus, ist tatsächlich aber sehr einfach.


cu,
Stefan
--
I don't make my mistakes more than once. I store them carefully and after some time I take them out again, add some new features and _reuse_ them.

Rate this thread