Страница: 1 | 2 | 3 | 4 | 5 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: VC++ Help Please ! (задачка)
     
    
Добавлено: 08.11.05 23:06
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     HACKER
 HACKER
      
       
  
 
    
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 67
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 61 
      
Автор ответа: HOOLIGAN
 HOOLIGAN

Вопросов: 0
Ответов: 1066
      
 Профиль |  | #61
       
Добавлено:  16.11.05 15:01
       
    
       
  
Блин, тэг code забыл  
     Чтобы не запутался в циклах, которые без {}, ещё раз
 Чтобы не запутался в циклах, которые без {}, ещё раз
char* replace ( char* lpString, char* lpMatch, char* lpReplace )
{
    int     match_count=0;
    int     str_len=0;
    int     match_len=0;
    int     repl_len=0;
    int     required;
    char*   pOut;
    char*   pSrc;
    char*   output;
    int     i=0;
    
    while ( lpString[str_len] ) str_len++;      //длина lpString
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++;   //длина lpMatch       
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++;   //длина lpReplace
    pSrc = lpString;
    while ( pSrc[0] )                           //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }
    if ( ! match_count ) return 0;
    
    required = str_len - ((match_len- repl_len)*match_count);   //длина новой строки
    if ( 0 == (output = new char[required+1] ) return 0;       //и получение памяти под неё
 ) return 0;       //и получение памяти под неё
    pOut = output;
    pSrc = lpString;
    
    while ( pSrc[0] )                       //поиск фрагментов и замена на новые
    {
        if ( pSrc[0] != lpMatch[0] )        //копируем символы не подлежащие замене, в вых.строку
        {
            pOut[0] = pSrc[0];
            pOut++; pSrc++;
        }
        else                                //если встретился символ, с которого начинается lpMatch
        {
            i = 0;
            while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
            if ( i == match_len )           //и lpMatch найдена целиком
            {
                for (i=0; i<repl_len; i++)  //вместо неё в вых. строку копируем lpReplace
                    pOut[i] = lpReplace[i];
                pOut += i; pSrc += match_len;
            }
            else pSrc++;                    //если совпал только первый символ lpMatch, продолжаем
        }                                   //копировать старую строку в вых. строку
    }
    pOut[0]=0;                              //завершаем вых. строку нулём
    
    return output;
    
}
P.S.
Павел, это не накрутка рейтинга. Не надо ругаться.
		
	  
			 
	
		 
    
       
    
Номер ответа: 62 
      
Автор ответа: HACKER
 HACKER








 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #62
       
Добавлено:  16.11.05 15:07
       
    
       
  
про memset понял, сёдня пойду препода загонять  
     
А вот с replace ...  
    #include <iostream.h>
    
//========================================================== 
char* replace ( char* lpString, char* lpMatch, char* lpReplace ) 
{ 
    int match_count=0; 
    int str_len=0; 
    int match_len=0; 
    int repl_len=0; 
    int required; 
    char* pOut; 
    char* pSrc; 
    char* output; 
    int i=0; 
     
    while ( lpString[str_len] ) str_len++; //длина lpString 
    if ( !str_len ) return 0; 
    while ( lpMatch[match_len] ) match_len++; //длина lpMatch 
    if ( !match_len ) return 0; 
    while ( lpReplace[repl_len] ) repl_len++; //длина lpReplace 
    pSrc = lpString; 
    while ( pSrc[0] ) //подсчёт кол-ва вхождений lpMatch в lpString 
    { 
        i=0; 
        while ( pSrc && (pSrc==lpMatch) ) i++; 
        if ( i == match_len ) 
        { 
            match_count++; 
            pSrc += i; 
        } 
        else pSrc++; 
    } 
    if ( ! match_count ) return 0; 
     
    required = str_len - ((match_len- repl_len)*match_count); //длина новой строки 
    if ( 0 == (output = new char[required+1] ) return 0; //и получение памяти под неё
 ) return 0; //и получение памяти под неё 
    pOut = output; 
    pSrc = lpString; 
     
    while ( pSrc[0] ) //поиск фрагментов и замена на новые 
    { 
        if ( pSrc[0] != lpMatch[0] ) //копируем символы не подлежащие замене, в вых.строку 
        { 
            pOut[0] = pSrc[0]; 
            pOut++; pSrc++; 
        } 
        else //если встретился символ, с которого начинается lpMatch 
        { 
            i = 0; 
            while ( pSrc && (pSrc==lpMatch) ) i++; 
            if ( i == match_len ) //и lpMatch найдена целиком 
            { 
                for (i=0; i<repl_len; i++) //вместо неё в вых. строку копируем lpReplace 
                    pOut = lpReplace; 
                pOut += i; pSrc += match_len; 
            } 
            else pSrc++; //если совпал только первый символ lpMatch, продолжаем 
        } //копировать старую строку в вых. строку 
    } 
    pOut[0]=0; //завершаем вых. строку нулём 
     
    return output; 
     
} 
void main(){
    char    String[128];        //буфер для строки "sadasd        sadasd  f" 
    char    Match[128]= " ";         //буфер для заменяемой строки (два пробела) 
    char    Replace[128]= "  ";       //буфер для заменяющей строки (один пробел) 
    char*   new_string; 
    char*   temp; 
    cout<<"Input string: \n"; 
    cin.getline (String,128);
    /* временная строка */ 
    temp = (char*) SysAllocStringByteLen( NULL, strlen(String) +1 );      
    
	strcpy (temp, String); //скопироали
     
    while ( (new_string = replace (temp, Match, Replace)) != 0 ) //цикл удаления пробелов
    { 
        strcpy ( temp, new_string ); 
        /*удаляем new_string*/ 
        SysFreeString( (BSTR) new_string ); 
    } 
     
    /* на выходе имеем строку "sadasd sadasd f"*/ 
    cout<<"\n"<<temp; 
    /*освобождаем временную строку*/ 
    SysFreeString( (BSTR) temp );
	cin.get();
}
Не вылетает, но и НЕ уберает пробелы  
		
	  
			 
	
		 
    
       
    
Номер ответа: 63 
      
Автор ответа: HACKER
 HACKER








 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #63
       
Добавлено:  16.11.05 15:12
       
    
       
  
ой незаметил 5-уй стр :) ну короче скопировал replace тот что ты в [CODE]... написал, и опять вылетать начало по тому же адресу :(
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 64 
      
Автор ответа: HOOLIGAN
 HOOLIGAN

Вопросов: 0
Ответов: 1066
      
 Профиль |  | #64
       
Добавлено:  16.11.05 16:27
       
    
       
  
Ясно дело, пробелы не уберет, ты же заменяешь один пробел на два! А надо наоборот  
     
И ещё: я ж написал, что переходим с SysAllocString на оператор new. Чтобы твоему преподу понравилось. Соответственно и удалять надо с delete[].
короче вот так должно быть:
    char    Match[]="  ";
    char    Replace[]=" ";
    char*   new_string;
    cout << "Input string: \n"; 
    cin.getline (String,128);
    char*   temp = new char[strlen(String) +1];
    
    strcpy (temp, String);
    while ( (new_string = replace (temp, Match, Replace)) != 0 )
    {
        strcpy ( temp, new_string );
        delete[] new_string ;
    }
    cout << "\n" << temp;
    cin.get();
И ещё: в replace замени фрагмент
на такой:
{
    pOut[0] = pSrc[0];
    pOut++; pSrc++;
}
так будет лучше.
Внимательней надо быть  
		
	  
			 
	
		 
    
       
    
Номер ответа: 65 
      
Автор ответа: HACKER
 HACKER








 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #65
       
Добавлено:  16.11.05 22:44
       
    
       
  
эх...  
     
{ 
    int match_count=0; 
    int str_len=0; 
    int match_len=0; 
    int repl_len=0; 
    int required; 
    char* pOut; 
    char* pSrc; 
    char* output; 
    int i=0; 
      
    while ( lpString[str_len] ) str_len++; //длина lpString 
    if ( !str_len ) return 0; 
    while ( lpMatch[match_len] ) match_len++; //длина lpMatch 
    if ( !match_len ) return 0; 
    while ( lpReplace[repl_len] ) repl_len++; //длина lpReplace 
    pSrc = lpString; 
    while ( pSrc[0] ) //подсчёт кол-ва вхождений lpMatch в lpString 
    { 
        i=0; 
        while ( pSrc && (pSrc==lpMatch) ) i++; 
        if ( i == match_len ) 
        { 
            match_count++; 
            pSrc += i; 
        } 
        else pSrc++; 
    } 
    if ( ! match_count ) return 0; 
      
    required = str_len - ((match_len- repl_len)*match_count); //длина новой строки 
    if ( 0 == (output = new char[required+1] ) return 0; //и получение памяти под неё
 ) return 0; //и получение памяти под неё 
    pOut = output; 
    pSrc = lpString; 
      
    while ( pSrc[0] ) //поиск фрагментов и замена на новые 
    { 
        if ( pSrc[0] != lpMatch[0] ) //копируем символы не подлежащие замене, в вых.строку 
        { 
            pOut[0] = pSrc[0]; 
            pOut++; pSrc++; 
        } 
        else //если встретился символ, с которого начинается lpMatch 
        { 
            i = 0; 
            while ( pSrc && (pSrc==lpMatch) ) i++; 
            if ( i == match_len ) //и lpMatch найдена целиком 
            { 
                for (i=0; i<repl_len; i++) //вместо неё в вых. строку копируем lpReplace 
                    pOut = lpReplace; 
                pOut += i; pSrc += match_len; 
            } 
			else                            //если совпал только первый символ lpMatch, продолжаем 
			{ 
				pOut[0] = pSrc[0]; 
				pOut++; pSrc++; 
			}
        } //копировать старую строку в вых. строку 
    } 
    pOut[0]=0; //завершаем вых. строку нулём 
      
    return output; 
      
} 
void main(){
    char    String[128]; 
    char    Match[]="  "; 
    char    Replace[]=" "; 
    char*   new_string; 
    cout << "Input string: \n"; 
    cin.getline (String,128); 
    char*   temp = new char[strlen(String) +1]; 
     
    strcpy (temp, String); 
    while ( (new_string = replace (temp, Match, Replace)) != 0 ) 
    { 
        strcpy ( temp, new_string ); 
        delete[] new_string ; 
    } 
    cout << "\n" << temp; 
    cin.get();
}
Что я теперь забыл? Сделал неправельно итп??? Всёравно нефига не заменят...
		
	  
			 
	
		 
    
       
    
Номер ответа: 66 
      
Автор ответа: HOOLIGAN
 HOOLIGAN

Вопросов: 0
Ответов: 1066
      
 Профиль |  | #66
       
Добавлено:  17.11.05 00:08
       
    
       
  
HACKER, ты блин чего, меня в гроб загнать хочешь своей невнимательностью  
     
Я тебе специально повторил код с тегом CODE.
А ты что скопировал к себе?
Вот твои строки:
....
....
while ( pSrc && (pSrc==lpMatch) ) i++; 
Таких  строк нет в ответе №61. 
Там есть такие строки:
while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
...
...
while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
Разницу улавливаешь? Индексы потерял, пока копировал. Индекс i в квадратных скобках. Я потому и повторил код в 61 ответе с тегом code, что форум этот индекс воспринимает как тэг курсива, бля.
Короче ещё раз  
Вот эту ф-цию аккуратненько берешь и копируешь вместо того, что у тебя
{
    int     match_count=0;
    int     str_len=0;
    int     match_len=0;
    int     repl_len=0;
    int     required;
    char*   pOut;
    char*   pSrc;
    char*   output;
    int     i=0;
    
    while ( lpString[str_len] ) str_len++;      //длина строки
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++;   //длина lpMatch       
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++;   //длина lpReplace
    pSrc = lpString;
    while ( pSrc[0] )                           //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }
    if ( ! match_count ) return 0;
    
    required = str_len - ((match_len- repl_len)*match_count);   //длина новой строки
    if ( 0 == (output = new char[required+1] ) return 0;       //и получение памяти под неё
 ) return 0;       //и получение памяти под неё
    
    pOut = output;
    pSrc = lpString;
    
    while ( pSrc[0] )                       //поиск фрагментов и замена на новые
    {
    	if ( pSrc[0] != lpMatch[0] )        //копируем символы не подлежащие замене, в вых.строку
    	{
    		pOut[0] = pSrc[0];
    		pOut++; pSrc++;
    	}
    	else                                //если встретился символ, с которого начинается lpMatch
    	{
    		i = 0;
    		while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
 ) i++;
            if ( i == match_len )           //и lpMatch найдена целиком
            {
            	for (i=0; i<repl_len; i++)  //вместо неё в вых. строку копируем lpReplace
                    pOut[i] = lpReplace[i];
                pOut += i; pSrc += match_len;
            }
            else                            //если совпал только первый символ lpMatch, продолжаем
            {
                pOut[0] = pSrc[0];
                pOut++; pSrc++;
            }
            
    	}                                   //копировать старую строку в вых. строку
    }
    pOut[0]=0;                              //завершаем вых. строку нулём
    
    return output;
    
}
Если опять ошибёшься, расстреляю  
P.S.
Павел, не ругайся.
Я уже выругался вместо тебя.
		
	  
			 
	
		 
    
       
    
Номер ответа: 67 
      
Автор ответа: HACKER
 HACKER








 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #67
       
Добавлено:  17.11.05 01:46
       
    
       
  
 
     )) ыыыы... спасибо, теперь работает
)) ыыыы... спасибо, теперь работает  ))) Ну ты это... не злись
))) Ну ты это... не злись  яж ничё
 яж ничё  просто глючЕло
 просто глючЕло  ))
))