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

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

Добавлено: 09 янв 2006, 18:56
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);
}
Заранее благодарен.

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

Добавлено: 09 янв 2006, 19:17
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++
     }
Я ужал вот до такого.

Добавлено: 09 янв 2006, 19:37
sanitar
Не проще ли то же самое реализовать как perl или sed фильтр?

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

#!/usr/bin/perl

while ($input=<>)
{
$input~=s/\ /\%20/g;
print $input;
}
Что-то типа такого.

Добавлено: 09 янв 2006, 21:16
xedin
нет, нужно именно на сях.

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

Добавлено: 09 янв 2006, 21:24
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
так что вот...

Добавлено: 09 янв 2006, 21:36
Llama
xedin, ну так PCRE тебе в руки... ;)

Добавлено: 09 янв 2006, 21:40
xedin
а без доп. либ никак? стандартные финкции не катят? просто как-то
влом как каждом компе где я захочу использовать эту прогу спец. пакеты ставить...

Добавлено: 09 янв 2006, 21:52
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;
}

Добавлено: 09 янв 2006, 22:03
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;
}
О! супер! Спасибо! Чуть-чуть не до думал блин :)))

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

Добавлено: 09 янв 2006, 22:56
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

Добавлено: 10 янв 2006, 11:44
sanitar
нет, нужно именно на сях.

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

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

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

"Пожалей того, кто будет поддерживать код" (ц) Фаулер.

Добавлено: 10 янв 2006, 12:35
Llama
sanitar, в предполагю что это либо лаба либо ее часть ;)

Добавлено: 10 янв 2006, 13:20
sanitar
Ужоснах.

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

Добавлено: 10 янв 2006, 17:55
sanitar
Тогда мое замечание в силе.
В мире unix не принято городить на скорую руку самодельные велосипеды, когда с вероятностью 95% можно использовать надежный внешний инструмент.