Я потихоньку изучаю язык С. Изучаю по книге Керниган и Ритчи.
Задание: Напишите версию функции squeeze(s1,s2), которая удаляет из
s1 все символы, встречающиеся в строке s2. Вот программа:
#include <stdio.h>
#define MAXCHAR 1000
int main() {
char line1[MAXCHAR] = "привет";
char line2[MAXCHAR] = "вет";
squeeze(line1,line2);
printf("%s\n",line1);
return 0;
}
squeeze(line1,line2)
char line1[];
char line2[]; {
int i,j,k = 0;
int d = 0;
char line3[MAXCHAR];
for (i = 0; line1[i] != '\0'; i++) {
for (j = 0; line2[j] != '\0'; j++)
if (line1[i] != line2[i])
d = 1;
if (d == 1) {
line3[k++] = line1[i];
d = 0;
}
}
line3[k] = '\0';
copy(line1,line3);
}
copy(line1,line2)
char line1[];
char line2[]; {
int i = 0;
while((line1[i] = line2[i]) != '\0')
i++;
}
Мне кажетмя, что она написана, как сказать, не красиво. Особено
функция squeeze. Вопрос, можно ли написть её не так каряво или это
всё мне лишь кажется?
Напишите функцию any(s1,s2), которая возвращает либо ту позицию в
s1, где стоит первый символ, совпавший с любым из символов в s2,
либо -1 (если ни один символ из s1 не совпадает с символами из
s2). (Стандартная библиотечная функция strpbrk делает то же самое,
но выдает не номер позиции символа, а указатель на символ.)
#include <stdio.h>
#define MAXCHAR 1000
int main() {
int i;
char line1[MAXCHAR] = "РТЙЧЕФ";
char line2[MAXCHAR] = "Ф";
i = any(line1,line2);
printf("%d\n",i);
return 0;
}
int any(line1,line2)
char line1[];
char line2[]; {
int i,c,d = 0;
for (c = 0; line1[c] != '\0'; c++) {
for (i = 0; line2[i] != '\0'; i++)
if (line1[c] == line2[i]) {
d = 1;
break;
}
if (d == 1)
break;
}
if (line1[c] == '\0')
c = -1;
return c;
}
То же самое
Какая может быть работа со строками в языке, название которого не строка, а символ? ;-)
А вообще, я написал бы так:
#include <stdio.h>
#include <string.h>
void squeeze(char *dest, const char *src, const char *chars_to_remove)
{
while(*src)
if (!strchr(chars_to_remove, *src))
*dest++ = *src++;
else
src++;
*dest = '\0';
}
int main()
{
char buf[20];
squeeze(buf, "hello, world", "ello");
puts(buf);
return 0;
}
>Ты используешь те средства языка, до которых я ещё попросту недошёл.
Интересно, это какие же? Или ты таки не дочитал ещё до pointers. В любом случае -- писать так, как ты (т.е. работать с сишными строками через индексы) -- себе же дороже. Только лишние переменные и чрезвычайная запутанность кода.
Понимаете, те коды, что вы написали, я понимаю. Я думаю чтоу меня впереди ещё куча программ, где надо будет использовать pointers. Надо уметь использовать все средства языка, что мне даны пока в книге. А потом переходить к новым. Спасибо вам за коды.
>Ты используешь те средства языка, до которых я ещё попросту недошёл.
рекомендую тебе прочитать всю книгу целиком, сначала не делая заданий(благо она - небольшая), а при втором подходе делоть все основательно, ну помимо самых элементаных вещей
Наверно можно и более короткую программу написать.
Это просто в свете многочисленных топиков в последнее время,
я решил вспомнить институтский курс по лиспу.
Вот написал бы кто-нибудь на лиспе более элегантную программу,
а я бы посмотрел.