Страница 1 из 1

Удаление пробелов в конце строки

Добавлено: 13 авг 2008, 19:15
ggruz
Пытаюсь программу написать(просто С учу по Кернигану-Ричи), чтобы удаляла все пробелы между последней буквой строки и символом '\n'. Но какая-то лажа получается(строки из одних пробелов не удаляются, а дублируются!):

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

#define maxl 1000
#define EOF -1
main()
{
	char n,p='0',buf[maxl],out[maxl];//next,previous bytes from input
	null(buf);//buffer string
	null(out);//output string
	while((n=getchar())!=EOF)
	{
		switch(n)
		{
			case ' ':
			put(n,buf);
			case '\n':
			if(p==' ')
				null(buf);
			else
				put(n,out);
			default:
			if(p==' ')
			{
				concat(buf,out);
				put(n,out);
			}
			else
				put(n,out);
		}
		p=n;
	}
	printf("%s\n",out);
}
put(a,b)
char a;
char b[];
{
	int i=0;
	while(b[i]!='\0')
	++i;
	b[i]=a;
	b[i+1]='\0';
}
null(a)
char a[];
{
	a[0]='\0';
}
concat(a,b)
char a[];
char b[];
{
	int i=0,j=0,k;
	while(b[i]!='\0')
	i++;
	while(a[j]!='\0')
	j++;
	for(k=i;k<i+j;k++)
	b[k]=a[k-i];
	null(a);
}
Компилилось gcc, но, наверное, в visual studio тоже должно заработать

Re: Удаление пробелов в конце строки

Добавлено: 14 авг 2008, 08:48
airyashov
учите switch()

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

switch(n){
case ' ':
	put(n,buf);
	break;

Re: Удаление пробелов в конце строки

Добавлено: 14 авг 2008, 22:35
ggruz

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

...
		switch(n)
		{
			case ' ':
			put(n,buf);
			break;
			case '\n':
			if(p==' ')
				{
				null(buf);
				break;
				}
			else
				{
				put(n,out);
				break;
				}
			default:
			if(p==' ')
			{
				concat(buf,out);
				put(n,out);
				break;
			}
			else
				{
				put(n,out);
				break;
				}
		}
		...
так?
спасибо,сделал, толку-то. теперь просто все символы '\n' игнорируются

Re: Удаление пробелов в конце строки

Добавлено: 15 авг 2008, 08:20
airyashov
Как Вы определяете, что они игнорируются, по моему все нормально поподает в "строку" out

Re: Удаление пробелов в конце строки

Добавлено: 17 авг 2008, 09:13
ggruz
на входе: "ab ba sd\n \nabb"
на выходе:"ab ba sd\nabb"т.е. игнорируются переносы строки около пробелов

Re: Удаление пробелов в конце строки

Добавлено: 18 авг 2008, 08:31
airyashov
все верно согласно этому условию

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

case '\n':
if(p==' ') null(buf); else put(n,out);
break;
иначе изменить на

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

case '\n':
if(p==' ') null(buf);
put(n,out);
break;
Ошибка здесь, так как неявную инициализацию делаете

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

void concat(char a[],char b[])
{
	int i=0,j=0,k;
	while(b[i]!='\0')
	i++;
	while(a[j]!='\0')
	j++;
	for(k=i;k<i+j;k++)
	b[k]=a[k-i];
	b[i+j]='\0';//надо завершить строку и буфер для неё на 1 больше должен быть
	null(a);
}
или for(k=i;k<=i+j;k++)

Re: Удаление пробелов в конце строки

Добавлено: 18 авг 2008, 16:10
ggruz
Спасибо большое, все заработало! Хотя после таких подсказок, задание, конечно, уже не может считаться сделанным :(