вставка %20 между слов

Все о программировании под *nix
Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

вставка %20 между слов

Сообщение xedin »

Между слов нужно вставлять %20 вместо пробела
пример : i%20love%you.
Я написал код, только он заменяет только первый пробел почему-что,
подскажите пожалуйсто как его переписать чтобы заменяло все пробелы между введёнными словами...

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

    char buf[1024];
    char tmp[1024];
    int i, m, n;

    memset(buf, 0, sizeof(buf));
    memset(tmp, 0, sizeof(tmp));

    gets(buf);
    m = strlen(buf);
    n = 0;
    for(i = 0; i < m; i++) {
        tmp[i] = buf[i];

        if(buf[i] == ' ') {

           tmp[i] = '%';
           n = ++i;
           tmp[n] = '2';
           ++n;
           tmp[n] = '0';
           ++n;


           do {
              tmp[n] = buf[i];

              n++;
              i++;
           } while(i != m);

        }

    }
   
 return(0);
}
Заранее благодарен.
Вечность имеет обыкновение проходить очень быстро....

gotty
Интересующийся
Сообщения: 68
Зарегистрирован: 15 ноя 2005, 06:52
Откуда: Minsk
Контактная информация:

Re: вставка %20 между слов

Сообщение gotty »

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

     for(i = 0; i < m; i++) { 
         if (buf[i] == ' ') { 
            tmp[n] = '%'; 
            n++
            tmp[n] = '2'; 
            n++; 
            tmp[n] = '0'; 
         } else {
            tmp[n] = buf[n]
         }
         n++
     }
Я ужал вот до такого.
ничего на свете лучше нету, чем 127.0.0.1

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

Не проще ли то же самое реализовать как perl или sed фильтр?

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

#!/usr/bin/perl

while ($input=<>)
{
$input~=s/\ /\%20/g;
print $input;
}
Что-то типа такого.
I'll kill this code without a knife -- with only fork().

Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

Сообщение xedin »

нет, нужно именно на сях.
Вечность имеет обыкновение проходить очень быстро....

Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

Re: вставка %20 между слов

Сообщение xedin »

gotty писал(а):

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

     for(i = 0; i < m; i++) { 
         if (buf[i] == ' ') { 
            tmp[n] = '%'; 
            n++
            tmp[n] = '2'; 
            n++; 
            tmp[n] = '0'; 
         } else {
            tmp[n] = buf[n]
         }
         n++
     }
Я ужал вот до такого.
а я результат вывел :
uname -abn -a
--> uname%20bn -%20⌂@↑їw
если как ты предлогаешь то :

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

int main(void) {
    char buf[1024], tmp[1024];
    int i,n,m;

    memset(buf, 0, sizeof(buf));
    memset(tmp, 0, sizeof(tmp));
    gets(buf);
    
    m = strlen(buf);
    n = 0;

   for(i = 0; i < m; i++) {
         if (buf[i] == ' ') { 
            tmp[n] = '%'; 
            ++n;
            tmp[n] = '2';
            ++n;
            tmp[n] = '0'; 
         } else { 
            tmp[n] = buf[n];
         } 
         ++n;
     }
     printf("--> %s\n", tmp);
 return(0);
}
но всё равно не то, вывод :
uanem -an -a
--> uanem%20n -%20
так что вот...
Вечность имеет обыкновение проходить очень быстро....

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

xedin, ну так PCRE тебе в руки... ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

Сообщение xedin »

а без доп. либ никак? стандартные финкции не катят? просто как-то
влом как каждом компе где я захочу использовать эту прогу спец. пакеты ставить...
Вечность имеет обыкновение проходить очень быстро....

bazil
Неотъемлемая часть форума
Сообщения: 879
Зарегистрирован: 18 дек 2003, 23:56

Сообщение bazil »

xedin, если следовать вашей прямой логике(стилю), то писал бы я так:

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

int main(void)
{	
	char buf[1024];
    char tmp[1024];
    int i, m, n;

    memset(buf, 0, sizeof(buf));
    memset(tmp, 0, sizeof(tmp));

    gets(buf);

    m = strlen(buf);
    n = 0;
    for(i=0;i<m;i++){
		if(buf[i]!=' '){
			tmp[n] = buf[i];
			n++;
		}else{
			tmp[n]='%';
			tmp[n+1]='2';
			tmp[n+2]='0';
			n+=3;                        
        }

    }
	printf("%s",tmp);
   
 return 0;
}
I did a 'zcat /vmlinuz > /dev/audio' and I think I heard God...

Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

Сообщение xedin »

bazil писал(а):xedin, если следовать вашей прямой логике(стилю), то писал бы я так:

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

int main(void)
{	
	char buf[1024];
    char tmp[1024];
    int i, m, n;

    memset(buf, 0, sizeof(buf));
    memset(tmp, 0, sizeof(tmp));

    gets(buf);

    m = strlen(buf);
    n = 0;
    for(i=0;i<m;i++){
		if(buf[i]!=' '){
			tmp[n] = buf[i];
			n++;
		}else{
			tmp[n]='%';
			tmp[n+1]='2';
			tmp[n+2]='0';
			n+=3;                        
        }

    }
	printf("%s",tmp);
   
 return 0;
}
О! супер! Спасибо! Чуть-чуть не до думал блин :)))
Вечность имеет обыкновение проходить очень быстро....

gotty
Интересующийся
Сообщения: 68
Зарегистрирован: 15 ноя 2005, 06:52
Откуда: Minsk
Контактная информация:

Re: вставка %20 между слов

Сообщение gotty »

xedin писал(а): если как ты предлогаешь то :

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

int main(void) {
    char buf[1024], tmp[1024];
    int i,n,m;

    memset(buf, 0, sizeof(buf));
    memset(tmp, 0, sizeof(tmp));
    gets(buf);
    
    m = strlen(buf);
    n = 0;

   for(i = 0; i < m; i++) {
         if (buf[i] == ' ') { 
            tmp[n] = '%'; 
            ++n;
            tmp[n] = '2';
            ++n;
            tmp[n] = '0'; 
         } else { 
            tmp[n] = buf[n];
         } 
         ++n;
     }
     printf("--> %s\n", tmp);
 return(0);
}
но всё равно не то, вывод :
uanem -an -a
--> uanem%20n -%20
так что вот...
Прошу прощения, опечатался : надо tmp[n] = buf
ничего на свете лучше нету, чем 127.0.0.1

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

нет, нужно именно на сях.

Почему? Это unix, а он предполагает то, что каждая задача решается именно тем инструментом, который лучше всего ее делает.
sed-Эквивалент приведенного кода вообще займет одну команду. Да и perlовый код тоже можно одной командной строкой реализовать.

подозреваю, что perl и sed есть в абсолютном большинстве инсталляций unix, кроме может быть внедренных систем.

И с точки зрения кода на С гораздо опрятнее вызвать внешнюю команду sed/perl, подключив ее к программным каналам ввода-вывода, чем городить реализацию собственного велосипеда на 40 строк.

"Пожалей того, кто будет поддерживать код" (ц) Фаулер.
I'll kill this code without a knife -- with only fork().

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

sanitar, в предполагю что это либо лаба либо ее часть ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

Ужоснах.
I'll kill this code without a knife -- with only fork().

Аватара пользователя
xedin
Заглянувший
Сообщения: 38
Зарегистрирован: 19 дек 2005, 21:09
Контактная информация:

Сообщение xedin »

Llama писал(а):sanitar, в предполагю что это либо лаба либо ее часть ;)
не угадали, это одна прога не имеет значения какая,
просто это нужно было на сях, я делал две версии на php и сях
Вечность имеет обыкновение проходить очень быстро....

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

Тогда мое замечание в силе.
В мире unix не принято городить на скорую руку самодельные велосипеды, когда с вероятностью 95% можно использовать надежный внешний инструмент.
I'll kill this code without a knife -- with only fork().

Ответить