Страница: 1 | 2 | 3 | 4 | 5 |
Вопрос: VC++ Help Please ! (задачка)
Добавлено: 08.11.05 23:06
Автор вопроса: HACKER
Ответы
Всего ответов: 67
Номер ответа: 61
Автор ответа:
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++;
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; //и получение памяти под неё
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++;
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
Разработчик 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; //и получение памяти под неё
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
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #63
Добавлено: 16.11.05 15:12
ой незаметил 5-уй стр :) ну короче скопировал replace тот что ты в [CODE]... написал, и опять вылетать начало по тому же адресу :(
Номер ответа: 64
Автор ответа:
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
Разработчик 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; //и получение памяти под неё
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
Вопросов: 0
Ответов: 1066
Профиль | | #66
Добавлено: 17.11.05 00:08
HACKER, ты блин чего, меня в гроб загнать хочешь своей невнимательностью
Я тебе специально повторил код с тегом CODE.
А ты что скопировал к себе?
Вот твои строки:
....
....
while ( pSrc && (pSrc==lpMatch) ) i++;
Таких строк нет в ответе №61.
Там есть такие строки:
while ( pSrc[i] && (pSrc[i]==lpMatch[i] ) i++;
...
...
while ( pSrc[i] && (pSrc[i]==lpMatch[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++;
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; //и получение памяти под неё
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++;
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
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #67
Добавлено: 17.11.05 01:46
)) ыыыы... спасибо, теперь работает ))) Ну ты это... не злись яж ничё просто глючЕло ))