2010-01-06 5 views
1

Итак, у меня есть char stringA и char stringB, и я хочу, чтобы иметь возможность вставлять stringB в строку A в точке x.Вставка символьной строки в другую строку символов

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

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

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

+1

Это домашнее задание? –

+0

Кроме того, вы отметили этот C++. Если это C++, и это не домашнее задание, почему бы просто не использовать std :: string? –

+0

Я знаю, как это сделать с помощью std :: string, и ya это домашнее задание –

ответ

9
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. Вы должны добавить символ nul ('\ 0') в конце, иначе вы, вероятно, получите мусор.
  4. Strcat, чтобы скопировать вторую строку.
  5. Еще один strcat для копирования оставшейся части первой строки (strA + x).

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

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

+0

ya я только использовал: \t char * strC = (char *) malloc (strlen (strA) + strlen (strB_); прекрасный ответ спасибо! –

+1

@Sj, не забывайте null char! –

+0

@Sj: он должен быть char * strC = malloc (strlen (strA) + strlen (strB) +1). Вы забыли о дополнительном символе для '\ 0'. Возможно, он работает, но у вас есть шанс переписать байт чего-то, что не является вашей строкой. Я не уверен, что gdb поймает это, но электрический забор будет жаловаться. – mingos

2
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); 
+0

Если вы хотите написать безопасное программное обеспечение, избегайте использования strcpy и т. Д., А вместо этого используйте варианты «l», в которых вы передаете размер измененной строки, следя за тем, чтобы вы не получали переполнения accidendal, которые могут привести к сбою вашего приложения и сделать его уязвимым к атакам. например: 'strlcpy (product, ..., sizeof (product)'. Если вы обнаружите, что это громоздко, сделайте для него макрос: '#define STRCPY (a, b) strlcpy (a, b, sizeof (a)) '. То же самое для strcat и т. Д. –

8

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

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

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

+0

Это было действительно полезно на концептуальном уровне, спасибо +1 –

0

Здесь представлено более общее решение.

Примечание, что 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); 
} 
Смежные вопросы