我正在尝试将字符串附加到字符串。
我试过
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
的变体。我的代码出现了分段错误。我做错了什么?
编辑:更清楚我想做的是: 让我们说text =“asdfghjk” 对于n = 3,我想要以下输出:
afj
sgk
dh
答案 0 :(得分:2)
我会做类似的事情:
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 :(得分:1)
这就是你想要的。
// 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]。 第四,作为前面提到的答案的作者,如果字符串还没有终止零,则无法计算字符串的长度。 第五,你不需要在每次迭代后清除一个字符串,因为覆盖它的字符并添加新的终止零将使它成为全新的字符串。
答案 2 :(得分:0)
你应该只创建一个新的String,在它的底部附加`string [strlen(string)] ='\ 0'; printf(“%s”,string); string = new String(“”);
`
答案 3 :(得分:0)
string[strlen(string)] = '\0';
这不会按预期工作。 string不会以NULL结尾,因此strlen()将在\ 0的字符串末尾后面查找,并且不会找到它。 (如果确实如此,你会用\ 0覆盖\ 0)。你想要的是那里的strlen(文本)。然后
char *string = malloc(strlen(text) + 1);
有足够的空间。
答案 4 :(得分:0)
回答问题,因为最初说明如何将单个字符附加到字符串的末尾,该字符串没有为其分配空间。
#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);
}