Добавление символа к строке

#c #string

#c #строка

Вопрос:

Я пытаюсь добавить символ в строку.

Я пытался

 char *string = malloc(strlen(text) * sizeof (char));
for(i=0, i <n; i  )
{
    j = i;
    while (j <= strlen(text))
    {
        string[strlen(string)] = text[i];
        j = j   n;
    }
    string[strlen(string)] = '';
    printf("%s", string);
    string = "";
}
 

Моя цель — создание вариаций text .У меня ошибка сегментации с этим кодом. Что я делаю не так?

РЕДАКТИРОВАТЬ: чтобы было более ясно, что я хочу сделать, это: допустим, text = «asdfghjk» И для n = 3 я хочу получить следующий результат:

 afj
sgk
dh
 

Комментарии:

1. Можете ли вы объяснить, чего вы пытаетесь достичь?

2. Вот подсказка: strlen это не операция O (1). Он пересчитывает длину строки (на основе нахождения конечной '' строки) каждый раз, когда вы ее вызываете. Обычно лучше вызвать его один раз и сохранить в переменной, обновляя переменную при добавлении в строку, чем вызывать ее три раза.

3. Вы не можете strlen(string) , если нулевой ограничитель не установлен string . Это приведет к ошибке сегментации.

4. Честно говоря, я не могу понять логику вашего кода. Для text=»teststring» и n = 3 (при условии, что все ошибки исправлены) вы получите string=»tttteeesss». Я не вижу никаких причин, по которым вы хотели бы это сделать.

5. @mephisto123 я обновил вопрос.

Ответ №1:

Я бы сделал что-то вроде:

 char *AppendCharToString( const char *orig, char newChar )
{
   int oldLength = strlen(orig);
   char *result = malloc( oldLength 2 ); // one byte for the new char, one for the terminator
   strcpy(result, orig);
   result[oldLength] = newChar;
   result[oldLength 1] = 0;
   return resu<
}
 

Комментарии:

1. Если ваши строки имеют размер > целого числа, я бы не рекомендовал этот метод. 🙂 (Конечно, вы правы, но иногда я придерживаюсь старой школы)

2. Верно. Однако меня интересует, что бы вы порекомендовали для таких больших строк.

3. Вы должны использовать a size_t вместо an int .

4. Для небольших дополнений вы можете выделить своим строкам дополнительное пространство в конце, где вы могли бы хранить добавленные данные. Для больших дополнений вы могли бы сохранить массив буферов памяти. В C есть std::deque для такого рода вещей. Вы могли бы имитировать это даже на обычном C, если бы захотели. Связанный список строк тоже может работать. Это действительно зависит от того, нужны ли вам непрерывные строки.

Ответ №2:

Это то, чего ты хочешь.

 // Params
char *text = "asdfghjk";
int n = 3;
// Code
int i, j, k, len = strlen(text);
char *s = malloc((len   1) * sizeof (char));
for (i = 0, i < n; i  ) {
    for (j = i, k = 0; j < len; j  = n) s[k  ] = text[j];
    s[k] = 0;
}
printf("%sn", s);
 

Прежде всего, строка с завершающим нулем займет strlen() 1 байт пространства. Не только strlen() .
Во-вторых, никогда не используйте strlen() в цикле. Предварительно вычислите его в int и используйте его.
В-третьих, у вас была ошибка: у вас был текст [i], но имелся в виду текст [j].
В-четвертых, как упоминали авторы предыдущих ответов, вы не можете вычислить длину строки, если она еще не имеет конечного нуля.
В-пятых, вам не нужно очищать строку после каждой итерации, поскольку перезапись ее символов и добавление нового завершающего нуля сделают ее совершенно новой строкой.

Ответ №3:

вы должны просто создать новую строку, добавив к ней то, что вы хотите, внизу, где ` string[strlen(string)] = »; printf(«%s», string); string = новая строка («»);

`

Ответ №4:

 string[strlen(string)] = '';
 

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

 char *string = malloc(strlen(text)   1);
 

Чтобы было достаточно места.

Ответ №5:

Хорошо, ответьте на проблему, как было указано изначально, как добавить один символ в конец строки, для которой НЕ выделено места.

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

/* note that str can be NULL for a new string */
char *straddchr(char *str, int c) {
    size_t len = str ? 2 strlen(str) : 2;
    char *p = realloc(str, len); /* add space (need space for char and ) */
    if ( !p ) 
        return str;
    str = p;
    str[len-2] = c; 
    str[len-1] = 0;
    return str;
}

int main() {
    char *str = NULL;
    str = malloc(5);
    strcpy(str, "Hell");
    str = straddchr(str, 'o');
    str = straddchr(str, ' ');
    str = straddchr(str, 'w');
    str = straddchr(str, 'o');
    str = straddchr(str, 'r');
    str = straddchr(str, 'l');
    str = straddchr(str, 'd');
    printf("%sn", str);
}
 

А вот второй бит, который вставляет символ в каждую n-ю позицию

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

/* note that str can be NULL for a new string */
char *strinjectchr(char *str, int c, int n) {
    size_t len = str ? strlen(str)   n   1: n   1;
    str = realloc(str, len);
    char *p;
    int i;

    if ( len == 1 n ) { /* original string was NULL */
    str[n] = 0;
    return memset(str, c, len-1); /* just use memset and send it all back */
    }

    char *copy = strdup(str);
    for (i = 0, p = copy; *p != 0; p  ) {
        str[i  ] = *p;
        if ( (i > 0) amp;amp; ((1 (p - copy))%n == 0) ) {
             str[i] = c;
             i  ;
    }
    }
    str[len] = 0;
    free(copy);
    return str;
}

int main() {
    char *str = NULL;
    str = strinjectchr(str, 'X', 25);
    printf("str is: %sn", str);
    str = strinjectchr(str, '-', 5);
    printf("str is: %sn", str);
    str = strdup("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    str = strinjectchr(str, 'n', 3);
    printf("str is: %sn", str);
}
 

Комментарии:

1. В коде немного не хватает отступов, но вы можете исправить их в редакторе, здесь это немного болезненно.