TCHAR substring und strpos?

WorldRacer

Erfahrenes Mitglied
Hallo,

habe in meinem Programm einen String vom Typ TCHAR[512].

Dieser enthält "S_C:\\Windows\\Temp" als Beispiel.

Wie finde ich im Programm heraus, an welcher Stelle S_ steht und extrahiere den Pfad dahinter? ICh hab mich fusselig gesucht, auch in der tchar.h finde ich nichts gescheites.

Ich bin auf den Typ TCHAR angewiesen (WindowsAPI), nicht das einer auf die Idee kommt ich solle einen anderen Typen verwenden. Auf die Idee wär ich schon selbst gekommen....
 
Hi.

Erstmal, TCHAR ist ein Makro und steht entweder für den Typ char oder wchar_t.

Um einen Substring in einem String zu suchen bietet sich die strstr Funktion an, bzw. die generische _tcsstr Funktion.

Gruß
 
hm. Das hatte ich schon versucht... Folgendes funktioniert aber irgendwie nicht:
C++:
wchar_t* pos1 = _tcschr(pchRequest, 'S');
wchar_t* pos2 = _tcschr(pchRequest, '_');

if(pos1 - pchRequest + 1 == 0 && pos1 - pchRequest + 1 == 1 ){
      MessageBoxA(0, "Blubb", "Blubb", MB_OK);
}
 
Zuletzt bearbeitet von einem Moderator:
hm. Das hatte ich schon versucht... Folgendes funktioniert aber irgendwie nicht:
C++:
wchar_t* pos1 = _tcschr(pchRequest, 'S');
wchar_t* pos2 = _tcschr(pchRequest, '_');

if(pos1 - pchRequest + 1 == 0 && pos1 - pchRequest + 1 == 1 ){
      MessageBoxA(0, "Blubb", "Blubb", MB_OK);
}
Ich sagte ja auch _tcsstr und nicht _tcschr. Und warum nimmst du plötzlich wchar_t? Warum bleibst du denn nicht bei TCHAR? (wenn du schon die generische Funktion verwendest?)

Außerdem solltest du nicht direkt MessageBoxA verwenden, sondern MessageBox:
C:
MessageBox(0, TEXT("Blubb"), TEXT("BLUBB"), MB_OK);

Und denk dran, alle String- bzw. Zeichenliterale in das TEXT() Makro einzuschließen.
 
Zuletzt bearbeitet von einem Moderator:
Ich nehme wchar_t* weil die Funktion keinen anderen Rückgabewert akzeptiert:

VC2008 hat gesagt.:
error C2665: "wcsstr": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\wchar.h(1029): kann 'const wchar_t *wcsstr(const wchar_t *,const wchar_t *)' sein
1> c:\programme\microsoft visual studio 9.0\vc\include\wchar.h(1084): oder "wchar_t *wcsstr(wchar_t *,const wchar_t *)"
1> bei Anpassung der Argumentliste '(LPTSTR, char)'

//edit: OK, habe jetzt folgendes:

C++:
if(_tcsstr(pchRequest, TEXT("S_") ) )
        MessageBox(0, TEXT("Blubb"), TEXT("BLUBB"), MB_OK);

Aber irgendwie will er trotzdem nicht. Habe mir das ganze auch noch aus dem MSDN abgeguckt: http://msdn.microsoft.com/en-us/library/ms902279.aspx
Warum?
 
Zuletzt bearbeitet von einem Moderator:
Ich nehme wchar_t* weil die Funktion keinen anderen Rückgabewert akzeptiert:
Du mußt schon richtig hinschauen, bei der Fehlermeldung ging es nicht um den Rückgabewert.
C++:
if(_tcsstr(pchRequest, TEXT("S_") ) )
        MessageBox(0, TEXT("Blubb"), TEXT("BLUBB"), MB_OK);

Aber irgendwie will er trotzdem nicht. Habe mir das ganze auch noch aus dem MSDN abgeguckt: http://msdn.microsoft.com/en-us/library/ms902279.aspx
Warum?
Lass dir mal anzeigen, was in pchRequest drin steht.

Gruß
 
Zuletzt bearbeitet von einem Moderator:
DAnke hat sich schon erledigt. hatte die if-abfrage nach einem else stehen, und die vorherige if-abfrage war immer true. Habs jetzt folgendermaßen geregelt:

C++:
std::string TCharToString(LPCTSTR t)
	{
		// Handy for converting TCHAR to std::string (char)
		// If the conversion fails, an empty string is returned.
		std::string str;
  #ifdef UNICODE
		// calculate the size of the char string required
		// Note: If wcstombs encounters a wide character it cannot convert
		//       to a multibyte character, it returns –1.
		int len = 1 + wcstombs(0, t, 0);
		if (0 == len) return str;

		char* c = new char[len];
		if (NULL == c) throw std::bad_alloc();
		c[0] = '\0';

		wcstombs(c, t, len);
		str = c;
		delete []c;
  #else
		str = t;
  #endif
		return str;
	}
C++:
std::string str = TCharToString(pchRequest);
if(str[0] == 'S' && str[1] == '_'){
 // ...blubb...do something....
}
 
Zuletzt bearbeitet von einem Moderator:
Hehe...Warum einfach wenn's auch kompliziert geht ;)

Klar so hätt ichs natürlich auch Lösen können. Hab nur nichtg damit gerechnet das die if-abfrage die davor geschaltet war immer true ist. Und mit std::string konnt ich besser umgehen ;)
 
Zurück