Удаление четных слов в строке
Я пытался сделать удаление четных слов в строке, но мой код не корректно удаляет эти слова. В чем может быть проблема? Прошу прошения, если вопрос выглядит плохо оформленным.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int beg, end,len;
char text[1024];
cout<<"Enter text(less than 1024 chars)\n";
cin.getline(text,1024);
for(int i = 0, iWord = 0; i < strlen(text); i++)
{
if(text[i] == ' ')
{
while(text[i] == ' ')
i++;
beg = i;
i++;
while(text[i] != ' ')
i++;
while(text[i] == ' ')
i++;
i--;
iWord++;
end = i;
if((iWord - 1) % 2 == 0)
if(strcpy(&text[beg], &text[end]))
text[strlen(text) - (end - beg)] = '\0';
i -= 2;
}
}
cout<<"String after removing odd words\n";
cout<<text<<endl;
system("pause");
return 0;
}
Ответы (1 шт):
strcpy(&text[beg], &text[end]);
Копирует также и '\0', не нужно его выставлять отдельно, да и strlen после копирования уже меньше, чем вы ожидаете.
Помимо пробела в качестве конца слова нужно ожидать также и конец строки, иначе можно считать последнее слово слишком длинным...
В конце итерации цикла необходимо правильно корректировать позицию счётчика.
Более менее исправленная версия:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
size_t beg, end;
char *text = new char[1024];
strcpy(text, "One Two Three Four Five Six");
// cout<<"Enter text(less than 1024 chars)\n";
// cin.getline(text,1024);
std::cout << text << "\n";
for(size_t i = 0, iWord = 0; text[i] != '\0'; i++)
{
if(text[i] == ' ' || text[i] == '\0')
{
while(text[i] == ' ') i++;
beg = i;
while(text[i] != ' ' && text[i] != '\0') i++;
while(text[i] == ' ') i++;
end = i;
iWord++;
if((iWord - 1) % 2 == 0) {
strcpy(&text[beg], &text[end]);
}
i -= end - beg + 1; // correct iterator
iWord--; // correct word cnt
}
}
std::cout << text << "\n";
}
PS: если я правильно помню, поведение копирования пересекающихся массивов не определено. В истории Linux был инцидент по этому поводу(только с memcpy). =)
