Добавление символа в строку - PullRequest
1 голос
/ 21 октября 2011

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

Я пытался

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)] = '\0';
    printf("%s", string);
    string = "";
}

Моя цель - создать варианты text. Я получил ошибку сегментации с этим кодом. Что я делаю не так?

РЕДАКТИРОВАТЬ: чтобы быть более ясным, что я хочу сделать, это: скажем, текст = "asdfghjk" И для n = 3 я хочу следующий вывод:

afj
sgk
dh

Ответы [ 5 ]

2 голосов
/ 21 октября 2011

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

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 result;
}
1 голос
/ 21 октября 2011

Это то, что вы хотите.

// 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("%s\n", s);

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

0 голосов
/ 22 октября 2011

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

#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 \0) */
    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("%s\n", 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) && ((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: %s\n", str);
    str = strinjectchr(str, '-', 5);
    printf("str is: %s\n", str);
    str = strdup("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    str = strinjectchr(str, '\n', 3);
    printf("str is: %s\n", str);
}
0 голосов
/ 21 октября 2011
string[strlen(string)] = '\0';

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

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

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

0 голосов
/ 21 октября 2011

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

`

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