文字列の末尾に単一の文字を追加する方法は元々問題に答えました。
#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);
}
そして、ここに文字を挿入する第2ビットは、すべて「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);
}
あなたが達成しようとしているかを説明することはできますか? – cnicutar
これはヒントです: 'strlen'はO(1)操作ではありません。あなたがそれを呼び出すたびに、文字列の長さを( '' \ 0 ''を見つけることに基づいて)再計算します。一度呼び出すと変数に格納し、文字列に追加すると変数を更新するのが一般的です。これは3回呼び出すよりです。 –
ヌルターミネータが 'string'に設定されていないときは' strlen(string) 'することはできません。これにより、セグメンテーションフォルトが生成されます。 – user482594