好的回答問題,因爲它最初聲明如何將單個字符追加到沒有空間分配給它的字符串的末尾。
#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);
}
你能解釋一下你想要達到的第二位? – cnicutar
這是一個提示:'strlen'不是一個O(1)操作。它會在每次調用它時重新計算字符串長度(基於找到尾部的'\ 0')。通常最好調用一次,並將其存儲在變量中,如果添加到字符串中,則更新變量,而不是調用它三次。 –
當空終止符未被設置爲「字符串」時,您不能'strlen(字符串)'。這會產生分段錯誤。 – user482594