[C] MemStrXX

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by greki_hoy, 28 Feb 2012.

  1. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Всем привет
    писал для себя может кому то пригодится

    Code:
    MemStrA
    MemStrIA
    MemStrW
    MemStrIW
    
    Str - указатель в возможно не нуль завершенный буфер 
    cchStr - размер в !символах буфера Str с учетом терминатора 
    SubStr - указатель в нуль завешенный буфер с искомой строкой 
    
    ex:
    char buf[] = {'c', 'o', 'o', 'l'}
    str = MemStrA(buf, _countof(buf), "cool")
    printf("%.*s\n", _countof(buf), str)
    
    бывает нужно выполнить strstr в строке которая
    может не завершаться терминатором мне конкретно
    это нужно было для поиска в буфере функции send
    строки Accept-Encoding: для замены в WINAPI
    и CRT таких функций не нашел поэтому и накалякал


    Code:
    PSTR MemStrA(PCSTR Str, SIZE_T cchStr, PCSTR SubStr)
    {
    	SIZE_T cchSubStr;
    
    	if (!cchStr || !*SubStr)
    		return NULL;
    
    	cchSubStr = lstrlenA(SubStr);
    
    	while (cchStr >= cchSubStr && *Str)
    	{
    		if (!StrCmpNA(Str, SubStr, cchSubStr))
    			return (PSTR)Str;
    
    		cchStr--;
    		Str++;
    	}
    
    	return NULL;
    }
    
    PSTR MemStrIA(PCSTR Str, SIZE_T cchStr, PCSTR SubStr)
    {
    	SIZE_T cchSubStr;
    
    	if (!cchStr || !*SubStr)
    		return NULL;
    
    	cchSubStr = lstrlenA(SubStr);
    
    	while (cchStr >= cchSubStr && *Str)
    	{
    		if (!StrCmpNIA(Str, SubStr, cchSubStr))
    			return (PSTR)Str;
    
    		cchStr--;
    		Str++;
    	}
    
    	return NULL;
    }
    
    PWSTR MemStrW(PCWSTR Str, SIZE_T cchStr, PCWSTR SubStr)
    {
    	SIZE_T cchSubStr;
    
    	if (!cchStr || !*SubStr)
    		return NULL;
    
    	cchSubStr = lstrlenW(SubStr);
    
    	while (cchStr >= cchSubStr && *Str)
    	{
    		if (!StrCmpNW(Str, SubStr, cchSubStr))
    			return (PWSTR)Str;
    
    		cchStr--;
    		Str++;
    	}
    
    	return NULL;
    }
    
    PWSTR MemStrIW(PCWSTR Str, SIZE_T cchStr, PCWSTR SubStr)
    {
    	SIZE_T cchSubStr;
    
    	if (!cchStr || !*SubStr)
    		return NULL;
    
    	cchSubStr = lstrlenW(SubStr);
    
    	while (cchStr >= cchSubStr && *Str)
    	{
    		if (!StrCmpNIW(Str, SubStr, cchSubStr))
    			return (PWSTR)Str;
    
    		cchStr--;
    		Str++;
    	}
    
    	return NULL;
    }
    
     
    #1 greki_hoy, 28 Feb 2012
    Last edited: 28 Feb 2012
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Если кому-то не принципиален язык, на C++ не надо писать велосипедов, да и код получается кроссплатформенным:
    PHP:
    #include <iostream>
    #include <string>

    int main()
    {
        
    char buf[] = {'a''b''c''c''o''o''l'};
        
    std::string str(bufsizeof(buf) / sizeof(char));
        
    std::cout << "Pos: " << str.find("cool") << std::endl;
        return 
    0;
    }