LINUX.ORG.RU

Подскажите ...


0

0

Будете смеятся, но, всетаки вы "отцы", если не умрете от смеха то подсажите решение по ниге Брайен В. Керниган, Деннис М. Ричи. Язык программирования "C", упражнение 1-7(Напишите программу, которая копирует ввод на вывод, заменяя при этом каждую последовательность из одного или более пробелов на один пробел). Спасибо.

anonymous

Я вообще-то на чистом C не пишу, но вот что набросалось из головы за несколько минут. Если будут ошибки, извиняйте - лепил не думая. Но как-то более-менее работать должна. Уверен, что можно написать лучше. Но хоть что-то.

Да, длина строк не более 100 ;) - было лень возиться с произвольной длиной. Исправлять где найдете. Удачи.

int main()
{
char str_in[NN];
int i,j, n_str;

scanf("%[^\n]", str_in);

n_str = strlen(str_in);

i=0; j=0;
while(i<n_str){
if(str_in[i]==' '){
i++; str_in[j++]=' ';
while( (str_in[i]==' ')&&(i<n_str) ) i++;
}
else{
str_in[j++]=str_in[i++];
}
}
str_in[j]=(char)0;

printf("%s\n", str_in);
}

atoku ★★★
()
Ответ на: комментарий от atoku

ПРостите, забыл заголовки.

#include <stdio.h>
#include <string.h>

#define NN 100

int main()
{
  char str_in[NN];
  int i,j, n_str;

  scanf("%[^\n]", str_in);

  n_str = strlen(str_in);

  i=0; j=0;
  while(i<n_str){
    if(str_in[i]==' '){
      i++; str_in[j++]=' ';
      while( (str_in[i]==' ')&&(i<n_str) ) i++;
    }
    else{
      str_in[j++]=str_in[i++];
    }
  }
  str_in[j]=(char)0;
  
  printf("%s\n", str_in);
}

atoku ★★★
()
Ответ на: ПРостите, забыл заголовки. от atoku

Чтобы не было ошибки типа переполнения, надо сделать что-то вроде

scanf("%100[^\n]", str_in);

а не как в программе. Но я не уверен. Все, ухожу...

atoku ★★★
()
Ответ на: ПРостите, забыл заголовки. от atoku

Этот пример выходит за рамки того упражнения =) Все эти string ещё не проходили в той части главы, поэтому автору надо по-проще что-нибудь.

Selecter ★★★★
()
Ответ на: комментарий от lg

> ну вы и извращенец .. 8-)

Ясный пень :)) Я же не знаю как с буфером клавиатуры работать и в жизни риды и райты не пользовал для стандартных вводов и выводов.

Впрочем, мой пример тоже ничего ;) Но ваш лаконичнее, согласен.

А тов. Селектеру отвечу, что вместо strlen можно написать просто так:

n_str = 0; while(str_in[n_str]!=(char)0) n_str++;

и все. Более стринги ни для чего не применяются.

atoku ★★★
()

Вот и мой вариант. Больше подходит для новичка, как я.

int main()
{
	static int input[100];
	static int output[100];
	int i=0;
	int skip=0;
	
	while( (input[i]=getchar()) != '\n' )
	{
		if(input[i]==' ' && input[i-1]==' ')
		{
			skip++;
		}else{
			output[i]=input[i];
		}
		i++;
	}
	
	output[i]='\n';
	printf("Вывод: ");
	for(i=0; output[i]!='\n'; i++) printf("%c", output[i]);
	printf("\nВырезано %d лишних пробелов\n", skip);
	return 0;
}

Selecter ★★★★
()
Ответ на: комментарий от Selecter

имхо, Селектерово творение не должно рабоать, будет просто убивать первую серию лишних пробелов, а если будет две серии или больше - помрет. :)

Но я не проверял. Мне просто не нравится строка output[i]=input[i];

Она не должна работать.

atoku ★★★
()

все, кроме lg, не могут запрограммировать конечный автомат. В следующей жизни они будут пачкой макарон (с)

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (15.06.2004 13:49:31):

> ...не могут запрограммировать конечный автомат. В следующей жизни они будут пачкой макарон (с)

Круто ! :-)

А чей (c)?

Кто вообще придумал макаронный компьютер?

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> А чей (c)?

лоровского анонимуса, скорей всего:)

В оригинале было: люди, использующие нити, просто не могут запрограммировать конечный автомат. В следующей жизни они будут пачкой макарон.

anonymous
()
Ответ на: комментарий от atoku

Упс. Забыл skip добавить для корректности.

output[i-skip]=input[i];

Selecter ★★★★
()
Ответ на: комментарий от anonymous

anonymous (*) (15.06.2004 14:02:24)

>> А чей (c)?

> лоровского анонимуса, скорей всего:)

Наверное, просто совпадение...

Я думал, речь идет о виртуальной машине для макаронной сортировки.

(Как отсортировать пачку спагетти по длине? Стукнуть по одному концу, и макароны отсортированы! Всего одна инструкция! Просто; машина Тьюринга отдыхает, и даже детерминированные конечные автоматы не нужны. Впрочем, квантовые компьютеры тоже отдыхают ;))

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

>(Как отсортировать пачку спагетти по длине? Стукнуть по одному концу, и макароны отсортированы! Всего одна инструкция! Просто; машина Тьюринга отдыхает, и даже детерминированные конечные автоматы не нужны. Впрочем, квантовые компьютеры тоже отдыхают ;))

А как они отсортируются? ;) Они ж просто выровняются по одному краю!!!

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (15.06.2004 15:51:53):

> А как они отсортируются? ;) Они ж просто выровняются по одному краю!!!

А по другому будут отсортированы! :-)

Die-Hard ★★★★★
()
Ответ на: комментарий от atoku

Что-то вы какой-то бред понаписали (:


ИМХО, лучше будет так:

main () {
        int c, c2;
        for(c2 = 0; (c = getchar()) != -1; ){
                if ((c != 0x20) || (c2 != 0x20)){
                        putchar(c);
                }
                c2 = c;
        }

fork
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.