Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo!

Habe eine Funktion:

#include "WordSearch.h"


/*

Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die

Index Datei existiere nicht, und müsse erstellt werden beendet!

Erste Unterscheidung: and || or:

bei Beiden:

	Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten)

bei and:

	VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutAnd

bei or:

	VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutOr	

*/

void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50])

{

	FILE *File;

	char szReadOut[500],

		 szToken[]="\t",

		 *Token,

		 szBuffer[1500],

		 szBufferCopy[1500];

	bool fFirst=true, fWord=false;

	int nA=0, Test=0,

		anFiles[500],

		nK=0,

		i, QuantityFiles=0;


	File = fopen(gszIndex, "r");

	if((File!=0)&&(strstr(szSearchCriterion, "and")))

	{

		while(fgets(szBuffer, 1500, File))

		{	

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			if(fFirst==true)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

				for(i=0; i<500; i++)

				{

					if(anFiles[i]!=0)

						fFirst = false;

				}

			}

			else if(fFirst==false)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

			}

		}

		fclose(File);

		for(i=0; i<500; i++)

		{

			if(anFiles[i]!=0)

			{

				fWord = true;

				QuantityFiles++;

			}

		}

		if(fWord==true)

		{ 

			if(nSearchedWords==1)

				cout << "Das Wort ";

			else

				cout << "Die Woerter ";

			for(i=0; i<nSearchedWords; i++)

			{

				if(i==0)

					cout << szInput[i];

				if(i>0)

					cout << " & " << szInput[i];

			}

			if(nSearchedWords==1)

			{

				if(QuantityFiles==1)

					cout << " kommt in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommt in folgenden Dateien vor:\n\n" << endl;

			}

			else

			{

				if(QuantityFiles==1)

					cout << " kommen in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommen in folgenden Dateien vor:\n\n" << endl;

			}

			OutAnd(anFiles);

		}

		else

		{

			cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie"

					" bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl;

		}

	}

	else if((File!=0)&&(strstr(szSearchCriterion, "or")))

	{

		while(fgets(szBuffer, 1500, File))

		{

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			for(i=0; i<nSearchedWords; i++)

			{	


				if(_stricmp(szReadOut, szInput[i])==0)

				{

					cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: ";

					VerifyOr(szBuffer, anFiles);

					OutOr(anFiles);

					cout << "\n";

				}

			}

		}

		cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME;

		fclose(File);

	}

	else

	{

		cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n";

	}

	cout << "\n";

}

Der funktioniert unter Windows einwandfrei. Wenn ich den unter Unix compilieren will, dann sagt er mir allerdings 'implicit declaration of function 'int _stricmp(...)'. Warum, und wie kann ich den Compiler dazu bekommen es zu compilieren?

Bine

Geschrieben

Das ist es nicht!

Der Befehl strimpc bzw. _stricmp funktioniert nicht unter Unix. Ist dort nicht bekannt. Das gleiche unter Unix bekommt man mit 'strcasecmp' hab ich jetzt herusgefunden!

Aber wie sieht es mit toupper, tolower bzw. _strlwr und _strupr aus???

Kannst Du mir da helfen? Ich finde da einfach nichts zu!

Bine

Geschrieben
Original geschrieben von Woodstock

Hmm, zweidimensionales Array!

Kann ich ja nicht riechen ;)

In dem Fall musst Du noch eine Schleife drumherum packen:


for( int i=0; i<stringanzahl; i++ ) {
char* p = stringarray[i];
while( *p ) {
*p = tolower( *p );
p++;
}
}[/CODE]

Geschrieben
Original geschrieben von Woodstock

Hmm, es klappt auch, aber warum tust Du das?

Wenn ich einen Zeiger, der auf ein Element eines Arrays zeigt, inkrementiere, zeigt er danach auf das nächste Element des Arrays. So gehe ich Zeichen für Zeichen durch den String. Das Zeichen selbst erhalte ich, wenn ich den Zeiger dereferenziere (*p). Wenn *p Null ist, dann ist das Ende des Strings erreicht, und ich kann aufhören.

Man hätte das ganze auch mit Indexoperatoren machen können:

for( int i=0; i<stringanzahl; i++ ) {
int j=0;
while( stringarray[i][j] ) {
stringarray[i][j] = tolower( stringarray[i][j] );
j++;
}
}[/CODE]

Letztendlich ist es dasselbe.

Geschrieben

Hab dazu noch ein Problem:

Also, ich habe folgende Quelltexte (unter Windows):

#include "WordSearch.h"


/*

Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die

Index Datei existiere nicht, und müsse erstellt werden beendet!

Erste Unterscheidung: and || or:

bei Beiden:

	Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten)

bei and:

	VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutAnd

bei or:

	VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutOr	

*/

void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50])

{

	FILE *File;

	char szReadOut[500],

		 szToken[]="\t",

		 *Token,

		 szBuffer[1500],

		 szBufferCopy[1500];

	bool fFirst=true, fWord=false;

	int nA=0,

		anFiles[500],

		nK=0,

		i, QuantityFiles=0;


	File = fopen(gszIndex, "r");

	if((File!=0)&&(strstr(szSearchCriterion, "and")))

	{

		while(fgets(szBuffer, 1500, File))

		{	

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			if(fFirst==true)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

				for(i=0; i<500; i++)

				{

					if(anFiles[i]!=0)

						fFirst = false;

				}

			}

			else if(fFirst==false)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

			}

		}

		fclose(File);

		for(i=0; i<500; i++)

		{

			if(anFiles[i]!=0)

			{

				fWord = true;

				QuantityFiles++;

			}

		}

		if(fWord==true)

		{ 

			if(nSearchedWords==1)

				cout << "Das Wort ";

			else

				cout << "Die Woerter ";

			for(i=0; i<nSearchedWords; i++)

			{

				if(i==0)

					cout << szInput[i];

				if(i>0)

					cout << " & " << szInput[i];

			}

			if(nSearchedWords==1)

			{

				if(QuantityFiles==1)

					cout << " kommt in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommt in folgenden Dateien vor:\n\n" << endl;

			}

			else

			{

				if(QuantityFiles==1)

					cout << " kommen in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommen in folgenden Dateien vor:\n\n" << endl;

			}

			OutAnd(anFiles);

		}

		else

		{

			cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie"

					" bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl;

		}

	}

	else if((File!=0)&&(strstr(szSearchCriterion, "or")))

	{

		while(fgets(szBuffer, 1500, File))

		{

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			for(i=0; i<nSearchedWords; i++)

			{	

				if(stricmp(szReadOut, szInput[i])==0)

				{

					cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: ";

					VerifyOr(szBuffer, anFiles);

					OutOr(anFiles);

					cout << "\n";

				}

			}

		}

		cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME;

		fclose(File);

	}

	else

	{

		cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n";

	}

	cout << "\n";

}
und
#include "WordSearch.h"


/*

Bei 1. Aufruf:

	Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die

	zugehörigen Zeilennummern (aus szBuffer) in das Array anFiles

	geschrieben.

Bei weiteren Aufrufen:

	Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die

	Zahlen die nicht mit denen aus dem ersten (oder anderen vorhergehenden Durchläufen)

	übereinstimmen wegnommen.  

*/

void VerifyAnd(int &nSearchedWords, char szInput[][1001], char *szReadOut,

					  char *szBuffer, int *anFiles, char *szSearchCriterion, bool &fFirst)

{

	int i = 0, nToken = 0;

	int nFiles2[500], nFiles3[500], nFiles4[500];

	int j = 0, k, i3 = 0, i2 = 0, i1;

	char *Token, szToken[]="\t", szBufferCopy[1000];

	bool fFound = false, fFound2=false;;


	for(i=0; i<500; i++)

		nFiles3[i] = anFiles[i];


	strcpy(szBufferCopy, szBuffer);


	for(i2=0; i2<nSearchedWords; i2++)

	{

		if(stricmp(szReadOut, szInput[i2])==0)

		{

			while(i3<nSearchedWords)

			{

				Token = strtok(szBufferCopy, szToken);

				while(Token!=0)

				{				

					nToken = atoi(Token);

					if(nToken!=0)

					{

						if(fFirst==true)

						{

							nFiles4[j] = nToken;

							j++;

						}

						if(fFirst==false)

						{

							nFiles2[j] = nToken;

							j++;

						}

					}

					Token = strtok(NULL, szToken);

				}

				i3++;	


			} // while

				j=0;

			if(fFirst==false)

			{		

				for(i=0; i<500; i++)

				{			

					for(k=0; k<500; k++)

					{

						if(anFiles[i]==nFiles2[k])

						{

							for(i1=0; i1<500; i1++)

							{

								if((nFiles3[i1])!=(anFiles[i]))

									fFound = true;

							}					

							if(fFound==true)

							{

								nFiles4[j] = anFiles[i];

								j++;

							}

							fFound=false;

						}

					}

				}	

			}

			for(i=0; i<500; i++)

			{

				anFiles[i] = 0;

			}

			j=0;

			for(i=0; i<500; i++)

			{

				anFiles[j] = nFiles4[i];

				j++;

			}

		} // if

	} // for

}

Habe diese Texte (alle anderen aus dem Programm sind im Moment nicht interessant) für Unix umgeschrieben. Sehe jetzt so aus:

[folgt im nächsten Beitrag wegen Überlänge!]

Geschrieben

#include "WordSearch.h"


/*

Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die

Index Datei existiere nicht, und müsse erstellt werden beendet!

Erste Unterscheidung: and || or:

bei Beiden:

	Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten)

bei and:

	VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutAnd

bei or:

	VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden:

		Aufruf OutOr	

*/

void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50])

{

	FILE *File;

	char szReadOut[500],

		 szToken[]="\t",

		 *Token,

		 szBuffer[1500],

		 szBufferCopy[1500];

	bool fFirst=true, fWord=false;

	int nA=0,

		anFiles[500],

		nK=0,

		i, QuantityFiles=0;


	File = fopen(gszIndex, "r");

	if((File!=0)&&(strstr(szSearchCriterion, "and")))

	{

		while(fgets(szBuffer, 1500, File))

		{	

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			if(fFirst==true)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

				for(i=0; i<500; i++)

				{

					if(anFiles[i]!=0)

						fFirst = false;

				}

			}

			else if(fFirst==false)

			{

				VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles,

					szSearchCriterion, fFirst);

			}

		}

		fclose(File);

		for(i=0; i<500; i++)

		{

			if(anFiles[i]!=0)

			{

				fWord = true;

				QuantityFiles++;

			}

		}

		if(fWord==true)

		{ 

			if(nSearchedWords==1)

				cout << "Das Wort ";

			else

				cout << "Die Woerter ";

			for(i=0; i<nSearchedWords; i++)

			{

				if(i==0)

					cout << szInput[i];

				if(i>0)

					cout << " & " << szInput[i];

			}

			if(nSearchedWords==1)

			{

				if(QuantityFiles==1)

					cout << " kommt in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommt in folgenden Dateien vor:\n\n" << endl;

			}

			else

			{

				if(QuantityFiles==1)

					cout << " kommen in folgender Datei vor:\n\n" << endl;

				else

					cout << " kommen in folgenden Dateien vor:\n\n" << endl;

			}

			OutAnd(anFiles);

		}

		else

		{

			cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie"

					" bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl;

		}

	}

	else if((File!=0)&&(strstr(szSearchCriterion, "or")))

	{

		while(fgets(szBuffer, 1500, File))

		{

			strcpy(szBufferCopy, szBuffer);

			Token = strtok(szBufferCopy, szToken);

			strcpy(szReadOut, Token);

			for(i=0; i<nSearchedWords; i++)

			{	

				if( strcasecmp(szReadOut, szInput[i])==0)

				{

					cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: ";

					VerifyOr(szBuffer, anFiles);

					OutOr(anFiles);

					cout << "\n";

				}

			}

		}

		cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME;

		fclose(File);

	}

	else

	{

		cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n";

	}

	cout << "\n";

}
und
#include "WordSearch.h"


/*

Bei 1. Aufruf:

	Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die

	zugehörigen Zeilennummern (aus szBuffer) in das Array anFiles

	geschrieben.

Bei weiteren Aufrufen:

	Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die

	Zahlen die nicht mit denen aus dem ersten (oder anderen vorhergehenden Durchläufen)

	übereinstimmen wegnommen.  

*/

void VerifyAnd(int &nSearchedWords, char szInput[][1001], char *szReadOut,

					  char *szBuffer, int *anFiles, char *szSearchCriterion, bool &fFirst)

{

	int i = 0, nToken = 0;

	int nFiles2[500], nFiles3[500], nFiles4[500];

	int j = 0, k, i3 = 0, i2 = 0, i1;

	char *Token, szToken[]="\t", szBufferCopy[1000];

	bool fFound = false, fFound2=false;;


	for(i=0; i<500; i++)

		nFiles3[i] = anFiles[i];


	strcpy(szBufferCopy, szBuffer);


	for(i2=0; i2<nSearchedWords; i2++)

	{

		if( strcasecmp(szReadOut, szInput[i2])==0)

		{

			while(i3<nSearchedWords)

			{

				Token = strtok(szBufferCopy, szToken);

				while(Token!=0)

				{				

					nToken = atoi(Token);

					if(nToken!=0)

					{

						if(fFirst==true)

						{

							nFiles4[j] = nToken;

							j++;

						}

						if(fFirst==false)

						{

							nFiles2[j] = nToken;

							j++;

						}

					}

					Token = strtok(NULL, szToken);

				}

				i3++;	


			} // while

				j=0;

			if(fFirst==false)

			{		

				for(i=0; i<500; i++)

				{			

					for(k=0; k<500; k++)

					{

						if(anFiles[i]==nFiles2[k])

						{

							for(i1=0; i1<500; i1++)

							{

								if((nFiles3[i1])!=(anFiles[i]))

									fFound = true;

							}					

							if(fFound==true)

							{

								nFiles4[j] = anFiles[i];

								j++;

							}

							fFound=false;

						}

					}

				}	

			}

			for(i=0; i<500; i++)

			{

				anFiles[i] = 0;

			}

			j=0;

			for(i=0; i<500; i++)

			{

				anFiles[j] = nFiles4[i];

				j++;

			}

		} // if

	} // for

}

aus. Unter Windows bekomme ich genau die Ausgabe (steht in einer anderen Funktion, greift aber auch das hier erstellte Array zu, also muss hier schon was falsche reingeschrieben worden sein). Und zwar möchte ich das wenn diese Wörter zusammen in einer Datei stehen mir diese Datei einmal ausgegeben wird. Dasklappt aber nicht immer. Die erste Datei gibt er mir genau so oft aus, wie die beiden Wörter vorkommen, und nicht nur insgesamt einmal.

Kann mir da wer helfen?

Bine

Geschrieben

Ich habe jetzt eine halbe Stunde lang versucht zu verstehen, was dieser Code macht. Leider ist die Wahl der Variablennamen "unglücklich" (unseren Praktikanten würde ich die Ohren langziehen ;)), die Kommentare im Code sind, sagen wir, sparsam gesetzt, und einige Verwirrungstaktiken hast Du auch eingesetzt (Variablen als Referenz übergeben, obwohl sie nicht verändert werden).

Ehrlich, ich steig nicht durch. Villeicht beschreibst Du mal, wie die Funktionen im Detail funktionieren *sollen*.

Eins ist mir aufgefallen: Das hier:

for(i=0; i<500; i++)
{
anFiles[i] = 0;
}
j=0;
for(i=0; i<500; i++)
{
anFiles[j] = nFiles4[i];
j++;
}
[/CODE] ist m.M.n nichts anderes als:
[CODE]for(i=0; i<500; i++)
{
anFiles[i] = nFiles4[i];
}

Geschrieben

Hmm, ok, mache ich gleich von zu Hause aus. Das mit der Referenz kann daher kommen, das die Funktion umgeschrieben würde, weil sie früher anders funktioniert hat, und ich habe eine extra Kommentar Datei. Aber ich gebe mich nachher mal dran.

Danke Dir schonmal.

Bine

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...