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

Вопросы по программированию, не подходящие в другие разделы.

Модераторы: Naeel Maqsudov, C_O_D_E

Ответить
ggruz
Сообщения: 4
Зарегистрирован: 12 авг 2008, 18:22

Пытаюсь программу написать(просто С учу по Кернигану-Ричи), чтобы удаляла все пробелы между последней буквой строки и символом '\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 тоже должно заработать
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

учите switch()

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

switch(n){
case ' ':
	put(n,buf);
	break;
ggruz
Сообщения: 4
Зарегистрирован: 12 авг 2008, 18:22

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

...
		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' игнорируются
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Как Вы определяете, что они игнорируются, по моему все нормально поподает в "строку" out
ggruz
Сообщения: 4
Зарегистрирован: 12 авг 2008, 18:22

на входе: "ab ba sd\n \nabb"
на выходе:"ab ba sd\nabb"т.е. игнорируются переносы строки около пробелов
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

все верно согласно этому условию

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

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++)
ggruz
Сообщения: 4
Зарегистрирован: 12 авг 2008, 18:22

Спасибо большое, все заработало! Хотя после таких подсказок, задание, конечно, уже не может считаться сделанным :(
Ответить