[C] strtok

sqee

Mitglied
Hi

Ich hab eine Frage und zwar, kann man wenn man strtik macht, die einzelnen token wieder zusammensetzen?!

Gruß
 
Hi.
Vorsicht, strtok verändert den Ursprungsstring und die Token sind direkte Zeiger in diesen String. Bei Verwendung von strcat dürfen der Quell- und Zielstring sich nicht überlappen!

Du könntest den Ursprungsstring wieder herstellen, indem du die \0 Zeichen, die strtok in den String eingefügt hat wieder mit Trennzeichen auffüllst.

Gruß
 
Das programm soll eine txt öffnen und darin wörter ersetzen .
Das Wort der durch das Wort das ersetzen.
txt steht:
der der der der
der
der
--------Soll dann das machen----
das das das das
das
das

Code:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void willkommen(void);


void willkommen(void)
{
	printf("Wordswap\n--------------\n"
		   "Das Programm ersetzt Woerter"
		   "aus einer Textdatei!!\n\n\n");

}
int main(void)
{
	//initialisierung
	FILE* srcfile;
	char leer[] = " ";
	char name1[256];
	char name2[256];
	char buffer[256];
	char SpBuff[256];
	char *wort;
	size_t laenge,laenge1;

	willkommen();

	printf("Welches Wort soll ersetzt werde: ");
	gets(name1);
	putchar('\n');
	printf("Durch welches Wort soll \"%s\" ersetzt werden: ",name1);
	gets(name2);
	printf("\n\n");
	laenge = strlen(name1);
	laenge1 = strlen(name2);
	srcfile = fopen("test.txt","r+b");

	while(fgets(buffer,256,srcfile)!= NULL)
	{
		
				wort = strtok(buffer,leer);
				while(wort != NULL)
					{
						if(strstr(wort,name1))
						{
							strncpy(SpBuff,name1,laenge);
							strncpy(buffer,name2,laenge1);
					  	  	
							fputs(name2,srcfile);
						}
						else
						{
							break;			
						}
						wort = strtok(NULL,leer);
					}
		strcat(buffer,wort);
							
	}
	fclose(srcfile);




return EXIT_SUCCESS;

}
 
Zuletzt bearbeitet:
Bitte verwende die Code-Tags für deine Codeschnipsel ([c]...[/c]).

Ich nehme mal an, du möchtest nicht nur Worte durch andere Worte gleicher Länge ersetzen, sondern z.B. auch "x" durch "abc".

Dann kannst du den Ursprungsstring nicht verwenden, zumal du die Token ja auch nicht zwischenspeicherst (was sich erst so anhörte).

Nimm einfach einen neuen Buffer und verwende strcat:
C:
 while(fgets(buffer,256,srcfile)!= NULL) {
  char buf[500] = { '\0' };

  wort = strtok(buffer,leer);
  while(wort != NULL) {
    if (strcmp(wort, name1) == 0) {
      strcat(buf, name2);
    } else {
      strcat(buf, wort);
    }
    strcat(buf, " ");
    wort = strtok(NULL, leer);
  }
  puts(buf);
}
\edit: Wobei du natürlich auch die Daten direkt ausgeben könntest und nicht erst die Zeile in einen Puffer zwischenspeichern müßtest...

Gruß
 
Zuletzt bearbeitet:
Danke für deine Hilfe=)
Soweit läuft es gut.

Aber eins funktioniert nicht, und zwar wenn er es in den puffer zwischenspeicher und ein "das\n" am schluss des satzes ist springt er direkt in die else und ändert das "das " nicht in z.B. "der"
 
Zuletzt bearbeitet:
Guten Morgen zusammen.

Ich hab ein Problem, in dem Programm (s.o)
Das Problem ist wenn ich in die While-Schleife gehe dort die Wörter in Token aufteile und am Ende eines Wortes z.B. "das\n" teilt er das Wort nicht in Token und ersetzt es nicht durch ein anderes Wort. Wenn ich in der Funktion strtok das Trennzeichen \n einfüge funktioniert alles, bloß er schreibt dann alles was im Buf steht in einer Zeile, anstatt in mehrere Zeilen.Heißt er springt nicht in ein new-line.
Nochmal hier der Code:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void willkommen(void);


void willkommen(void)
{
	printf("Wordswap\n--------------\n"
		   "Das Programm ersetzt Woerter"
		   "aus einer Textdatei!!\n\n\n");

}
int main(void)
{
	//initialisierung
	FILE* srcfile;
	FILE* file;
	char leer[] = " .,?!-";
	char name1[]={0};
	char name2[256]={0};
	char buffer[256]={0};
	char *wort;
	

	int i = 1;
//	size_t laenge,laenge1;
	char buf[500] = { '\0' };

	willkommen();

	printf("Welches Wort soll ersetzt werde: ");
	gets(name1);
	putchar('\n');
	printf("Durch welches Wort soll \"%s\" ersetzt werden: ",name1);
	gets(name2);
	
	
	printf("\n\n");
	//laenge = strlen(name1);
	//laenge1 = strlen(name2);
	srcfile = fopen("test.txt","r");
	file	= fopen("test2.txt","w+");


while(fgets(buffer,256,srcfile)!= NULL)
{
  
	wort = strtok(buffer,leer);
	
		while(wort != NULL)
		{

		

			if (strcmp(wort, name1) == 0) 
			{
				strcat(buf, name2);
			}
			else
			{
				strcat(buf, wort);
			}
			
			strcat(buf, " ");	
			wort = strtok(NULL, leer);
			
		}
	
	
}
fputs(buf,file);
fclose(srcfile);
fclose(file);

return EXIT_SUCCESS;

}
 
Hi.

Dann entferne doch einfach das \n Zeichen nachdem du die Zeile eingelesen hast.

Schau in die Doku zur Funktion fgets wie diese arbeitet.

Gruß
 
Zurück