Страница 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% можно использовать надежный внешний инструмент.