Консультация № 180752
14.11.2010, 23:10
0.00 руб.
0 1 1
Здравствуйте эксперты! Помогите написать программу на Си без использования функций ‘str’: Дана строка, содержащая слова, разделенные 1-м или несколькими разделительными символами (пробелами, табуляторами), в начале строки и в конце строки могут находиться разделительные символы. Сформировать новую строку, в которой слова исходной строки записаны в порядке возрастания длин и разделены одним пробелом. В начале и конце строки не должно быть разделительных символов.

Обсуждение

Неизвестный
15.11.2010, 07:28
общий
это ответ
Здравствуйте, Magma!

Программа написана в MS Visual Studio 6.0.
Похожа на программу из вопроса 180749, "с использованием функций str", отличается только блоком разбора строки.
Блок отмечен комментарием // PARSE
Алгоритм не оптимальный, но простой (может можно и проще)
Используются 2 указателя psz и pszt (t - от tail)
Первый блок в цикле // CHECK DELIMITERS - проверяет наличие идущих подряд нескольких разделителей или разделителей, идущих вначале.
Второй блок // CUT STRING - добавляет строку, если хвостовой указатель pszt нашёл разделитель.
Ну и в конце цикла, если мы не нашли разделителей, приращаем pszt на единицу - на один символ далее.

Приложение:
#include "stdafx.h"
#pragma warning(disable:4786)
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std ;

int main(int argc, char* argv[])
{
// GET DATA
string s1;
cout << "Enter a string:";
getline(cin, s1);

// PARSE
vector<string> vStrings;
char *psz, *pszt;
char szDelimiters[] = "\t ";
int iDelimiters= 2;

psz = (char*)s1.c_str();
pszt = (char*)s1.c_str();
bool bDelimiter = false;
int i;
while(*psz != 0)
{
// CHECK DELIMITERS
bDelimiter = false;
for(i=0; i<iDelimiters; i++)
{
if(*psz == szDelimiters[i])
{
bDelimiter = true;
psz++;
pszt++;
break;
}
}
if(bDelimiter)
continue;

// CUT STRING
for(i=0; i<iDelimiters; i++)
{
if(*pszt == szDelimiters[i] || *pszt==0)
{
int iLen = pszt-psz;
if(iLen)
{
char *pszNew = new char[iLen+1];
while(psz != pszt)
*pszNew++ = *psz++;
*pszNew = 0;
pszNew -= iLen;

vStrings.push_back(string(pszNew));
delete[]pszNew;

bDelimiter = true;
break;
}
}
}
if(!bDelimiter)
pszt++;
}

// SORT
vector<string>::iterator it;
if(vStrings.size() > 1)
{
bool bFound = true;
while(bFound)
{
bFound = false;
it = vStrings.begin()+1;
for(; it<vStrings.end(); it++)
{
if((*(it-1)).length() > (*it).length())
{
swap(*(it-1), *it);
bFound = true;
}
}
}
}

// OUTPUT
string strOut;
it = vStrings.begin();
for(; it<vStrings.end(); it++)
{
strOut += *it + " ";
}
cout <<strOut;

return 0;
}

Форма ответа