Вставка строки символов в другую строку символов - PullRequest
2 голосов
/ 06 января 2010

Хорошо, поэтому у меня есть строка charA и строка stringB, и я хочу иметь возможность вставить строку B в строку A в точке x.

char *stringA = "abcdef";
char *stringB = "123";

с продуктом "ab123cdef"

кто-нибудь знает, как это сделать? Заранее спасибо

Ответы [ 5 ]

12 голосов
/ 06 января 2010
char * strA = "Blahblahblah", * strB = "123", strC[50];
int x = 4;
strncpy(strC, strA, x);
strC[x] = '\0';
strcat(strC, strB);
strcat(strC, strA + x);
printf("%s\n", strC);

Пояснение:

  1. Вы объявляете две строки, к которым будете присоединяться, плюс третью строку, в которую вы их поместите.
  2. Вы объявляете целое число, сообщающее программе, через сколько символов вы хотите вставить вторую строку в первую.
  3. Функция strncpy копирует первые x символов в strC. Вы должны добавить нулевой ('\ 0') символ в конце, иначе вы, вероятно, получите мусор.
  4. Strcat для копирования второй строки.
  5. Еще один strcat для копирования оставшейся части первой строки (strA + x).

Надеюсь, это поможет.

Примечание: не забудьте сделать strC достаточно длинным, чтобы содержать и strA, и strC, иначе вы получите ошибку сегментации. Вы можете сделать это, объявив строку как массив, как в моем примере.

8 голосов
/ 06 января 2010

stringA и stringB являются указателями - они содержат начальный адрес для большого двоичного объекта памяти. Память, на которую они указывают, содержит непрерывные строки символов: «abcdef» и «123» соответственно. Поскольку строки являются смежными блоками памяти (это означает, что область памяти данного символа составляет один байт после предыдущего), вы не можете вставить больше символов в середину строки без предварительного перемещения некоторых символов. В вашем случае вы даже не можете этого сделать, так как объем памяти, выделенный для каждой строки, достаточно велик, чтобы вместить ПРОСТО эту строку (игнорируя заполнение).

То, что вам нужно сделать, это скопировать строки в другой блок памяти, который вы выделили для этой цели, и скопировать их так, чтобы вторая строка начинала с х символов в первой строке.

Несколько других пользователей SO опубликовали кодовые решения, но я думаю, что вы должны попытаться найти точное решение самостоятельно (и, надеюсь, поможет мое объяснение того, что происходит на высоком уровне).

2 голосов
/ 06 января 2010
int insert_pos = 5;
int product_length = strlen(stringA) + strlen(stringB) + 1;
char* product = (char*)malloc(product_length);
strncpy(product, stringA, insert_pos);
product[insert_pos] = '\0';
strcat(product, stringB);
strcat(product, stringA + insert_pos);
...
free(product);
1 голос
/ 03 января 2017

Вот более общее решение.

Обратите внимание , что destination должно иметь достаточно места в памяти для добавления начального числа (например, выделенный в куче массив размером больше, чем strlen(seed)+strlen(destination)). Итак, что касается вопроса, вы должны создать больший массив.

/* 
    destination: a NULL terminated string
    pos: where insert seed
    seed: a NULL terminated string
*/
void insertString(char* destination, int pos, char* seed)
{
    char * strC;

    strC = (char*)malloc(strlen(destination)+strlen(seed)+1);
    strncpy(strC,destination,pos);
    strC[pos] = '\0';
    strcat(strC,seed);
    strcat(strC,destination+pos);
    strcpy(destination,strC);
    free(strC);
}
0 голосов
/ 09 мая 2019
char *strInsert(char *str1, const char *str2, int pos) {
    size_t l1 = strlen(str1);
    size_t l2 = strlen(str2);

    if (pos <  0) pos = 0;
    if (pos > l1) pos = l1;

    char *p  = str1 + pos;
    memmove(p + l2, p, l1 - pos);
    memcpy (p, str2,  l2);
    return str1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...