Zeichenfolge im Text suchen

Kaiser206

Erfahrenes Mitglied
Hallo,
ich will eine Funktion schreiben die bestimmt ob eine Zeichenfolge in einem Text (String) vorhanden ist oder nicht. Dabei sollte die Groß- und Kleinschreibung nicht beachtet werden. Kann mir da jemand weiterhelfen?
 
Hi,

ich würde das wie folgt lösen:

1. beide strings (also den eigentlichen Text und das Gesuchte) durchgehen und die Großbuchstaben mit Kleinbuchstaben ersetzen

EDIT: Wenn du einen Großbuchstaben hast, mache einfach +32

2. den string durchgehen und nach dem ersten buchstaben des Gesuchten suchen.
Wenn er gefunden ist, dann immer weitervergleichen
 
Zuletzt bearbeitet:
Hallo,

Für Punkt 1 stimme ich Flegmon zu,
Punkt 2 kann man doch mit der find Funktion viel einfacher realisieren, anstatt Buchstabe für Buchstabe durchzugehn...

Code:
string gesamttext;
string suchtext;

if(gesamttext.find(suchtext) != -1)
{
   // Suchtext wurde gefunden...
}
else
{
  // Suchtext nicht gefunden
}

MfG Turri
 
Du kannst die Funktion tolower verwenden, um einen String in Kleinbuchstaben umzuwandeln, dann brauchst Du ihn nicht selber durchgehen.

@turri:
Das geht natürlich nur, wenn er mit STL-Strings arbeitet.
 
@jokey
ja haste recht, aber Kaiser hat nicht wirklich viel Auskunft gegeben mit was er genau arbeitet ;)
ich hab nur eine weitere Möglichkeit vorgestellt ;-)

MfG Turri
 
Also erstmal arbeite ich mir AnsiStrings, daher funktioniert das beispiel von Turri bei mir nicht. Gibt es für einen AnsiString denn nicht sowas Ähnliches?
 
Code:
AnsiString deinansistring;
string normal = deinansistring.c_str();
dann sollte das gehn...

// Edit: wenn du den normalen string dann wieder als AnsiString haben willst geht das auch mit der c_str()

MfG Turri
 
Kaiser206 hat gesagt.:
Also erstmal arbeite ich mir AnsiStrings, daher funktioniert das beispiel von Turri bei mir nicht. Gibt es für einen AnsiString denn nicht sowas Ähnliches?
Kuck doch in die Borland Hilfe. Da muß doch drin stehen was die AnsiString Klasse für Methoden anbietet. Ich glaube da hieß die Methode Pos bzw. AnsiPos. Das steht doch bestimmt aber alles in der Hilfe drin. :rtfm:

Turri hat gesagt.:
C++:
if(gesamttext.find(suchtext) != -1)
Die Methode find der std::string Klasse gibt std::string::npos zurück wenn der Wert nicht gefunden wurde.

Gruß
 
Leider ist es nicht ganz so einfach.

1.) Arbeiten die Funktione tolower und toupper normalerweise immer mit dem 7 Bit ANSI Zeichensatz. D.h., Umlaute werden nicht berücksichtigt
2.) if xxx.find("yyy") !=-1
Wird zwar funktionieren aber um wirklich portable zu sein, sollte man auch die dafür die STL bemühen.

std::string strMyString = "Ein Text mt Umlauten äüöß";
std::setlocale( LC_ALL, "german" );
std::transform (strMyString.begin(),strMyString.end(), strMyString.begin(), toupper);

if (strMyString.find("UM")!=std::string::npos)
{ //gefunden
}

Gruß
Gerhard

P.S. auf using namespace std; habe ich bewußt verzichtet um deutlich zu machen, wo die STL verwendet wird
 
Also ich bin in meiner Antwort davon ausgegangen, dass Kaiser alles komplett selbst schreiben will.


Eine komplett selbstgeschriebene Funktion könnte so aussehen:

(ich hab sie jetzt nicht ausprobiert, aber sie sollte soweit funktionieren. Es sind evtl. ein paar Vertipper oder so drin)

C++:
int find(char* str, char* strToFind)
{
	// damit an den strings nichts geändert wird, wird eine kopie erstellt
	char* str0 = new char[strlen(str)];
	if(!str0)
		return 0;
	char* str1 = new char[strlen(strToFind)];
	if(!str1)
	{
		delete[] str0;
		return 0;
	}
	
	// beim Kopieren schon alles in Kleinbuchstaben wandeln
	// (Umlaute werden hier nicht berücksichtigt, sollte aber leicht integrierbar sein)
	for(int i = 0; i < strlen(str); i++)
	{
		str0[i] = str[i];
		if(str0[i] > 64 && str0[i] < 91)
			str0[i] += 32;
	}
    for(int i = 0; i < strlen(strToFind); i++)
	{
		str1[i] = strToFind[i];
		if(str1[i] > 64 && str1[i] < 91)
			str1[i] += 32;
	}

	// jetzt nur noch suchen
	// speichert die nummer der Vorkommen
	int n = 0;

	// strlen(str) - strlen(strToFind), da der string ab einem bestimmten Zeichen vor dem Ende nicht mehr
	// vorkommen kann
	for(int i = 0; i <= strlen(str) - strlen(strToFind); i++)
	{
		if(str0[i] == str1[0])
		{
			// speichert, ob die strings gleich sind
			bool b = true;
			// Die erste Stelle ist bereits überprüft, deswegen fangen wir mit 1 an
			for(int j = 1; j < strlen(strToFind); j++)
			{
				if(str0[i +j] != str1[j])
				{
					b = false;
					break;
				}
			}
			if(b)
				n++;
		}
	}

	delete[] str0;
	delete[] str1;
	
	return n;
}

EDIT: eine kleine Änderung an der Funktion

EDIT: ich merk grad es ist ein kleiner Fehler drin. Ich behebe ihn später, hab jetzt keine Zeit

EDIT: hab den Fehler gefunden. Es war nur ein falsches Zeichen. Jetzt Funktionierts, so wie es soll. Es kommen nur n paar Warnungen beim kompilieren aber die sind schnell behoben
 
Zuletzt bearbeitet:
Zurück