как соединить символ с символом * в C? - PullRequest
0 голосов
/ 20 декабря 2011

Как я могу добавить char c к char* myChar?У меня c имеет значение "A", а myChar имеет значение "LL".Как я могу добавить c к myChar, чтобы сделать "ALL"?

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Ну, во-первых, вам нужно найти хранилище для вашей новой строки. Если все, что я знаю об источнике, это char *, я не знаю, указывает ли он на буфер, который я могу перезаписать и / или достаточно длинный, или мне нужно выделить новый буфер.

Чтобы выделить новый буфер, это будет примерно так:

char * strprep(char c, const char * myChar)
{
    /* length, +1 for c, +1 for '\0'-terminator */
    char * newString = malloc(strlen(myChar) + 2);

    /* out-of-memory condition rolls downhill */
    if (newString == NULL) return NULL;

    /* populate the new string */
    newString[0] = c;
    strcpy(newString + 1, myChar);
    return newString;
}

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

char * strprep(char c, char * myChar)
{
    int len = strlen(myChar);
    int i;

    /* Move over! */
    for (i = len; i >= 0; i--) myChar[i + 1] = myChar[i];

    /* Now plug in the new prefix. */
    myChar[0] = c;
    return c;
}

Если в вашей библиотеке C она есть, вы можете использовать memmove вместо цикла, чтобы сместить исходные символы на единицу.

2 голосов
/ 20 декабря 2011

Это должно работать:

#include <string.h>    
char * prepend(const char * str, char c)
{
    char * new_string = malloc(strlen(str)+2);  // add 2 to make room for the character we will prepend and the null termination character at the end
    new_string[0] = c;
    strcpy(new_string + 1, str);
    return new_string;
}

Просто запомните free() полученную новую строку, когда вы закончите ее использовать, иначе у вас будет утечка памяти.

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

0 голосов
/ 20 декабря 2011

Вероятно, не самый эффективный, но это шаг в правильном направлении: этот шаг явно прямой -

  int main()
   {
      int i;
      char tempc;
      for (i=0; i<strlen(str); i++)
      {
        tempc = c;
        c = str[i];
        str[i] = tempc;            
         str[i+1] = c;
      }
       *(str[i+1]) = malloc(1);
       str[i+1] = '\0';
    }
...