программа на си по обработке строки

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
riptor
Сообщения: 2
Зарегистрирован: 20 ноя 2007, 15:25

20 ноя 2007, 15:28

Помогите кто может написать программу на си которая получает от пользователя строку слов разделённой пробелами и табуляцией нужно эту строку обработать так чтобы между словами оставить только один пробел и раставить слова в алфавитном порядке и вывести на экран

вот часть кода который у меня шас есть
#include <stdio.h>
#include <string.h>


int words (char *from,char *to)
{
//char *from=buf ,*to=buf;
int l,k ;
k=0;l=0;

strcat(from," ");
*to='\0';
while(*(from+=strspn(from," \t")))
{
strncat(to,from,strcspn(from," \t"));
from=strpbrk(from," \t");
*to=' ';
k++;
}return k;}
//k++;
//l=strspn(from," \t");
//if (!l)
// *to++=l;
// *from=*to;
// while (l-->0)
// *to++=*from++;
// *to++=' ';
//}
//*to='\0';
//return k;
//}

/* int spase(char buf[])
{ char *from=buf;
for (;*from=" "|| *from=='/t';*from++);
return from;
}*/
int swop(char buf[],int l)
{
int i,k,n;
char *p ;
int tmp[80];
for (i=0;*buf+=strspn(buf," \t") && i<l;i++,buf+=strcspn(buf," \t"));
if (!*buf) return 0;
n=strspn(buf," \t");
p=buf+n+strspn(buf+n," \t");
if (!*p) return 0;
k=strcspn(buf," \t");
i=strncmp(buf,p,k);
if(i>0 || !i && n>k)
{
strncpy(tmp,buf,n+1);
for(i=0;i<=k;i++) buf=p;
strncpy(p+k-n,tmp,n+1);
return 1;}
return 0;
}
int main()
{
char buf[80],buf2[80];
int i,n,j;
i=0;j=0;n=0;
while (printf("enter string "), gets(buf))
{
//spase(buf);
n=words(buf,buf2);
for (i=1;i<n;i++)
for(j=0;j<n-1;j++)
swop(buf2,j);
printf("%s\n",buf2);
}return 0;
}

как задумывалось в первой функции должны удалятся лишнии пробелы и символы табуляци и фозвращать значение равное количеству строк
на данный момент она пока только удаляет пробелыи табуляцию.
вторая функция уже должна раставлять слава ф алфавитном порядке не знаю работает ли она правильно

можете если не трудно исправить эту или написсать свою
Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

20 ноя 2007, 17:35

Эта задачка должна быть реализована именно на СИ? Если на С++ писать то стандартная библиотека позволяет это сделать довольно легко, никакие дополнительные функции писать не понадобится.
Приглашаю на свой сайт http://winmain.org
riptor
Сообщения: 2
Зарегистрирован: 20 ноя 2007, 15:25

21 ноя 2007, 00:34

функция форд там работает уже нормально в измёнёной версии считает кол во слов и удаляет лишние пробелы и табуляцию но вот сортировка в своп есть затык вот тут что то тампрограмаа заедает

for (i=0;*buf+=strspn(buf," \t") && i<l;i++,buf+=strcspn(buf," \t"));
if (!*buf) return 0;

хотя если на си++ напишете мож и разберусь
Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

21 ноя 2007, 11:57

Примерно так эта программа будет выглядеть на С++

Код: Выделить всё

#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>
#include <strstrea.h>

char *str = "January   February 	 March	   April	 May	 June"; // строка

int main(int argc, char* argv[])
{
	istrstream iss(str);
	std::vector<std::string> strv; // массив строк
	char s[20];	// слово
	while (!iss.eof())
	{
		iss >> s;
		if (s[0] != '\0')
		{
			strv.push_back(s);
		}
	}

	std::sort(strv.begin(), strv.end());
	std::vector<std::string>::iterator it;
	for (it = strv.begin(); it != strv.end(); ++it)
	{
		if (it != strv.begin())
		{
			printf(" ");
		}
		printf(it->c_str());
	}
	printf("\n");

	return 0;
}
Проверил на VC++ 6.0
Результат выполнения программы выглядит так:
April February January June March May
Приглашаю на свой сайт http://winmain.org
Ответить