LINUX.ORG.RU

конкурс по си

 ,


7

4

На опеннете есть новость про то как сотрудник redhat шлёт левые патчи в ядро чтобы обойти проблемы systemd (http://www.opennet.ru/opennews/art.shtml?num=39476). Собстно, вот патчик:

http://lkml.iu.edu//hypermail/linux/kernel/1404.0/01327.html

Имхо, это ужас. Вот уж действительно товарищ принял упорин. Во-первых, он так и не понял почему редактирование /proc/cmdline это зло. Во-вторых, код ужасен, не? Неужели в сях нет способа проще вырезать подстроку? Ну и само по себе использование «магических» цифр 4 и 5 позорит код.

Так вот, конкурс по вырезанию произвольного слова из строки объявляю открытым! Учтите что слово может встречаться несколько раз.

Нормальный код, я всегда такой пишу!

hizel ★★★★★ ()

Мама мия! Там ещё и негативные индексы!!!

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

К свему стыду, я не до конца понимаю что там происходит. Имхо, проще заново написать чем разобраться.

true_admin ★★★★★ ()

конкурс по вырезанию произвольного слова из строки объявляю открытым

str_replace() аналог в Си есть? Или либа с описанием функции?
Я-то Си только учу, боюсь написать суровый велосипед.

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

str_replace() аналог в Си есть?

Nope.

Я-то Си только учу, боюсь написать суровый велосипед.

Так смысл конкурса в этом и состоит.

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

К свему стыду, я не до конца понимаю что там происходит.

А зачем тред генерить ?

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

Кстати если там будет два вхождения «debug», то вырежет только первый.

я не до конца понимаю что там происходит

А что тебя там смущает? man strstr хватит всем!

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

Мысль! Пора обессмертить свой никнейм в git-логе ядра.

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

А зачем тред генерить ?

Чтобы местные гуру показали «как надо». Я уже свой вариант, кстати, написал.

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

Вот вам мой наколенный быдлокод:

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

char *
cutout(char *hay, char *needle)
{
        char *p, *s = hay;

        while ((s = strstr(s, needle)) != NULL) {
                if ((p = strchr(s, ' ')) != NULL)
                        memmove(s, p + 1, strlen(p));
                else
                        *s = '\0';
        }

        return hay;
}

char teststring[] = "debug some debug and not only debug=debug but also debug";

int
main()
{
        puts(teststring);
        puts(cutout(teststring, "debug"));

        return 0;
}

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 3)
Ответ на: комментарий от hizel

Уверен, этот код меня сделает бессмертным!

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

char* cut(char *src, char *what) {
  char *sub, *dst = malloc(strlen(src)+1), *result = dst;
  assert(dst);
  size_t wtflen = strlen(what);

  while (*src) {
    sub = strstr(src, what);
    while(src != sub && (*dst++ = *src++));
    if (src == sub) {
      src = sub + wtflen;
      continue; }
  } 
  return result;
}

int main(void) {
  printf("%s\n", cut("debug ops debug ops", "debug"));
  return 0;
}
true_admin ★★★★★ ()

конкурс по вырезанию произвольного слова из строки

А что здесь сложного? Пусть strin — входная строка, substr — подстрока, которую удалить надо. Функция возвращает динамически выделенную строку — результат удаления подстроки из входной строки.

Вот:

cat 1.c 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *delsubstr(char *strin, char *substr){
  size_t sl = strlen(substr), ol = strlen(strin);
  char *strout = NULL, *iptr, *optr, *eptr;
  if(sl > ol) return strdup(strin);
  strout = strdup(strin);
  if(!strout) return NULL;
  optr = strout; eptr = strout + ol;
  do{
    iptr = strstr(optr, substr);
    if(!iptr) break;
    optr = iptr;
    iptr += sl;
    if(iptr >= eptr) break;
    ol = strlen(iptr) + 1;
    memmove(optr, iptr, ol);
  }while(1);
  optr = strdup(strout);
  free(strout);
  return optr;
}

int main(int argc, char **argv){
  if(argc != 3){
    printf("usage: %s string_ori substring\n", argv[0]);
    return 1;
  }
  printf("%s with deleted %s:\n%s\n", argv[1], argv[2], delsubstr(argv[1], argv[2]));
  return 0;
}

gcc 1.c -o del_substr -Wall -Werror && ./del_substr "длинная строка, в которой строка - текст, который строка удалить надо строка вот" строка
длинная строка, в которой строка - текст, который строка удалить надо строка вот with deleted строка:
длинная , в которой  - текст, который  удалить надо  вот

Eddy_Em ☆☆☆☆☆ ()
void process(const char *str, const char *substr, char *buffer, size_t bufferSize)
{
    char *ptr = buffer;
    size_t substrLength = strlen(substr);

    while (*str && (ptr - buffer < bufferSize - 1))
    {
        if (!strncmp(str, substr, substrLength))
            str += substrLength;
        *ptr++ = *str++;
    }
    *ptr = '\0';
}
Gvidon ★★★★ ()
Последнее исправление: Gvidon (всего исправлений: 1)

Чуток заимпрувил чтобы совсем лохом не казаться:

char* cut(char *src, char *what) {
  char *sub, *dst = malloc(strlen(src)+1), *result = dst; assert(dst);

  while (*src) {
    while(src != strstr(src, what) && (*dst++ = *src++));
    if (*src)
      src = src + strlen(what);
  } 
  return result;
}
true_admin ★★★★★ ()
Ответ на: комментарий от wota

Ага, уже заметил. Нужно строчку «*ptr++ = *str++» поместить под else

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

<--- здесь должен быть коммент о пользе KOI8

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

при чем здесь кои8? оно даже с хрюникодом будет работать, т.к. тупо по последовательности байтиков гоняет же!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от beastie

При перемещении назад нам абсалютно класть на меммув, ибо ничем не отличается от strcpy(str, str) - ты читаешь блок(любой) и при записи его ты не можешь повредить следующий блок.

Ну и общая анскильность и неосиляторство твоё пичалит меня.

Carb ()

Так вот, конкурс по вырезанию произвольного слова из строки объявляю открытым! Учтите что слово может встречаться несколько раз.

char * _remove(char * string, char * needl) {
  char * next = string;
  while((next = strstr(next, needl)))
    strcpy(next, next + strlen(needl));
  return string;
}
Carb ()

V2

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

void strremove( char* s, const char* t )
{
    size_t l = strlen( t );
    char *d = s;
	
    do while( !strncmp( s, t, l ) ) s += l;
    while( *d++ = *s++ );
}

int main()
{
    char s[] = "debugdebug-some debug string debug";
    strremove( s, "debug" );

    printf( "%s\n", s );
	
    return 0;
}
wota ★★ ()
Ответ на: комментарий от qulinxao

Для патча да, для задания тс"а - правильно. Но какбэ его проблема в формулировки задачи, а не моя. Яж там незря копипасту влепил.

А так да, приучайся не кукарекать, а объяснять - почему же оно неправильно, а так я на каждый твой выхлоп могу кукарекать «неправильно».

Carb ()

Странно, что все участники конкурса вызывают strlen в цикле.

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

Мухаха! memmove надо использовать, когда области памяти перекрываются! Ты — очередной быдлокодер, который man memcpy не читал!

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

конкурс по вырезанию произвольного слова из строки

А что здесь сложного? Пусть strin — входная строка, substr — подстрока, которую удалить надо. Функция возвращает динамически выделенную строку — результат удаления подстроки из входной строки.

Вот:

Я - не программист! Помните это.

fixed.

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

Странно, что все участники конкурса вызывают strlen в цикле

Я, я так не делаю! Где мой пирожок?

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

Это жуткий быдлокод, который не будет работать, т.к. нельзя копировать перекрывающиеся области памяти при помощи strcpy или memcpy. Об этом даже дети знают!

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

Это жуткий быдлокод, который не будет работать, т.к. нельзя копировать перекрывающиеся области памяти при помощи strcpy или memcpy. Об этом даже дети знают!

и где ты там увидел strcpy или memcpy?

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

И что? Быдлокод писать — программистом быть не надо!

Ты на ЛОРе найди сначала хоть пару десятков программистов! А?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Gvidon

Я, я так не делаю!

Хвалю!

Где мой пирожок?

Возьми средний из двух воон на той полке.

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

Ты думаешь, я так далеко вверх смотрел? Я думал ты о комментарии к Carb'овскому варианту.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от wota

требуется не s/nedle//g

а s/[^alpha|^]nedle[^alpha|$]//g

т.е нужно вырезать слово , а не подстроку

для вырезания слова можно проще поступать - скакать по «пробелам» и матчить префиксы - код как не странно так же прост .

qulinxao ★★☆ ()
Последнее исправление: qulinxao (всего исправлений: 1)

А еще strtok можно использовать.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от tailgunner

Патамучто так-то класть, а гцц говно, да и лишнаяя строчка - надо перефигач. Один хрен эта функция тормазное говно и выпил стрлена на 6сивлов её не спасёт.

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

т.е нужно вырезать слово , а не подстроку

цитирую ТС: «Неужели в сях нет способа проще вырезать подстроку?», задачу давал он, а не ты

для вырезания слова можно проще поступать - скакать по «пробелам» и матчить префиксы - код как не странно так же прост .

ну дык дай свое решение, а я потом свое приведу

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