Есть ли функция, которая может добавлять начало строки без необходимости создавать два разных массива символов в C? - PullRequest
0 голосов
/ 22 апреля 2020

Объединить до конца строки в C легко:

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

int main(int argc, char *argv[]){
    char str[15] = "new ";

    printf("old str = %s\n", str);
    strcat(str, "word");
    printf("new str = %s\n", str);
    return 0;
}

Вывод:

old str = new
new str = new word

Но когда я добавляю к началу массива я делаю это:

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

int main(int argc, char *argv[]){
    char str[15] = "word";
    char newStr[15] = "new ";

    printf("str = %s\n", str);
    strcat(newStr, str);
    printf("new str = %s\n", newStr);
    return 0;
}

Вывод:

str = word
new str = new word

Но есть ли функция, которая позволяет мне добавлять в начало строки в одна линия? Чтобы быть более понятным, есть ли способ добавить в начало строки, не создавая два разных массива char? Я просто чувствую, что мой код выглядел бы намного чище, если бы я мог просто сделать это:

полусудо-код функции добавления

str = "word";
append(str, "new ");

и при печати даст следующий вывод:

str = word
new str = new word

Что-то вроде этого сделало бы мою жизнь намного проще, так как в последнее время я много работал с файловыми вводами.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы можете сделать свои собственные:

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

char  *strprepend(char str[], char const *prefix)
{
    size_t slen = strlen(str);
    size_t plen = strlen(prefix);
    memmove(str+plen,str,slen+1);
    memcpy(str,prefix,plen);
    return str;
}

int main(int argc, char *argv[]){
    char str[15] = "word";
    printf("str = '%s'\n", str);
    printf("new str= '%s'\n", strprepend(str,"new "));
    return 0;
}
/*
Output:

str = 'word'
new str= 'new word'

*/

Если вы не хотите sh копировать небезопасную strcat, вы можете добавить проверку размера буфера.

1 голос
/ 24 апреля 2020

Нет, возможно, вам стоит взглянуть на внутренности ядра FreeBSD, чтобы увидеть, как они решают проблему со стеком TCP / IP. Поскольку им необходимо эффективно (это означает, что при отсутствии необходимости в копировании строк) создаются пакеты, и они должны добавлять данные в начало, они выделяют некоторые структуры (называемые mbuf s, которые строятся с использованием маленьких, предварительно выделенных и с несколько мощностей), чтобы построить полные пакеты. Они также начинают заполнять данные не в начале, но они резервируют некоторое пространство перед ним, чтобы добавить его позже, когда объем данных для добавления известен. Это также сделано в linux, так что это также хорошая отправная точка.

Кстати, было бы хорошо, если бы вы объяснили вашу конкретную проблему ... так что можно оценить вас в как лучше и качественнее можно построить свою вещь. Подумайте, что перераспределение и копирование данных, как правило, вредная привычка, и это ведет к низкой производительности и неэффективному коду. Наилучший подход - подумать, как можно разрабатывать вещи, не перемещая большие блоки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...