字符串连接在C中没有strcat
我在连接C中的字符串时遇到问题,没有strcat库函数。 这是我的代码
#include #include #include int main() { char *a1=(char*)malloc(100); strcpy(a1,"Vivek"); char *b1=(char*)malloc(100); strcpy(b1,"Ratnavel"); int i; int len=strlen(a1); for(i=0;i<strlen(b1);i++) { a1[i+len]=b1[i]; } a1[i+len]='\0'; printf("\n\n A: %s",a1); return 0; }
我对代码进行了更正。 这很有效。 我现在可以不用strcpy吗?
下面的老答案
您可以使用strcpy
初始化字符串,就像在代码中一样,或者在声明char数组时直接初始化。
char a1[100] = "Vivek";
除此之外,你可以做char-by-char
a1[0] = 'V'; a1[1] = 'i'; // ... a1[4] = 'k'; a1[5] = '\0';
或者您可以编写几行代码替换strcpy
并使其成为函数或直接在main函数中使用。
老答案
你有
0 1 2 3 4 5 6 7 8 9 ... a1 [V | i | v | e | k | 0 | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _] b1 [R | a | t | n | a | v | e | l | 0 | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _]
而你想要的
0 1 2 3 4 5 6 7 8 9 ... a1 [V | i | v | e | k | R | a | t | n | a | v | e | l | 0 | _ | _ | _ | _ | _ | _ | _ | _]
所以……
a1[5] = 'R'; a1[6] = 'a'; // ... a1[12] = 'l'; a1[13] = '\0';
但是有循环和东西,对吗? :d
试试这个(记得添加缺失的位)
for (aindex = 5; aindex < 14; aindex++) { a1[aindex] = b1[aindex - 5]; }
现在想想上面循环中的5
和14
。
你有什么可以取而代之的? 当你回答这个问题时,你已经解决了你的编程问题:)
char a1[] = "Vivek";
将创建一个大小为6
的char数组a1
。 你试图用更多的字符来填充它。
如果你想能够容纳连接"Vivek"
和"Ratnavel"
你需要一个大小至少为14 (5 + 8 + 1)
的char数组。
在您修改的程序中,您正在执行:
char *a1=(char*)malloc(100); // 1 a1 = "Vivek"; // 2
1:将分配一个大小为100字节的内存块,使其指向a1
。
2:将a1
指向字符串文字"Vivek"
。 无法修改此字符串文字。
要修复此问题,请使用strcpy将字符串复制到已分配的内存中:
char *a1=(char*)malloc(100); strcpy(a1,"Vivek");
for
循环条件i
i
和
a1[i]='\0';
应该
a1[i + len]='\0';
因为a1
的新长度是i+len
,你需要在该索引处有NUL字符。
完成使用后,不要忘记free
动态分配的内存。
您无法安全地写入这些数组,因为您还没有确保有足够的空间可用。 如果使用malloc()
来分配空间,则不能通过分配字符串文字来覆盖指针。 在这种情况下,您需要使用strcpy()
将字符串复制到新分配的缓冲区中。
此外,C中字符串的长度由strlen()
函数计算,而不是您正在使用的length()
。
连接时,您需要在适当的位置终止,您的代码似乎没有这样做。
这是我如何重新实现strcat()
,如果需要由于某种原因:
char * my_strcat(char *out, const char *in) { char *anchor = out; size_t olen; if(out == NULL || in == NULL) return NULL; olen = strlen(out); out += olen; while(*out++ = *in++) ; return anchor; }
请注意,当涉及缓冲区溢出时,这与strcat()
一样糟糕,因为它不支持限制输出中使用的空间,它只是假设有足够的可用空间。
问题:
-
length
不是一个function。strlen
是,但你可能不应该把它称为循环 –b1
的长度不会改变我们,是吗? 此外,它返回一个size_t
,它可能与您平台上的int
大小相同,但是将是无符号的。 这可能(但通常不会)导致错误,但无论如何都应该正确执行。 -
a1
只有第一个字符串有足够的空间,因为编译器不知道为字符串的其余部分分配额外的堆栈空间。 如果您提供明确的大小,如[100]
,那么这应该足以满足您的需要。 如果你需要健壮的代码,而不是对“足够”的东西进行假设,那么你应该研究malloc
和朋友,尽管这可能是另一天的教训。 - 你的循环太早停止了。
i < b1_len
(假设你有一个变量,b1_len
,在循环开始之前设置为b1
的长度)就足够了 -strlen
不计算结尾的'\0'
。 - 但是说到最后计算
'\0'
,在这种情况下,稍微更高效的实现可以使用sizeof a1 - 1
而不是strlen(a1)
,因为a1
(和b1
)被声明为数组,而不是指针。 这是你的选择,但请记住sizeof
不适用于指针,所以不要混淆它们。
编辑:新问题: -
char *p = malloc(/*some*/); p = /* something */
char *p = malloc(/*some*/); p = /* something */
是一个问题。=
使用指针不复制内容,它会复制值,因此您将丢弃从malloc
获得的旧指针值。 要将字符串的内容复制到char *
(或char []
),您需要使用strcpy
,strncpy
或(我的首选项)memcpy
。 (或者只是一个循环,但这是相当愚蠢的。再说一次,如果你正在编写自己的strcat
,这可能是一个好习惯。) - 除非你使用C ++,否则我不会转换
malloc
的返回值,但这是一场宗教战争,我们不需要其中一个。 -
如果你有
strdup
,请使用它。 如果你不这样做,这是一个有效的实现:char *strdup(const char *c) { size_t l = strlen(c); char *d = malloc(l + 1); if(d) memcpy(d, c, l + 1); return d; }
它是C标准库中最有用的function之一。
你也可以使用strcpy();)
char *a = (char *) malloc(100); char *b = (char *) malloc(100); strcpy(a, "abc"); // initializes a strcpy(b, "def"); // and b strcpy((a + strlen(a)), b); // copy b at end of a printf("%s\n",a); // will produce: "abcdef"
我觉得这很简单。
#include int xstrlen(char *); void xstrcat(char *,char *,int); void main() { char source[]="Sarker"; char target[30]="Maruf"; int j=xstrlen(target); xstrcat(target,source,j); printf("Source String: %s\nTarget String: %s",source,target); } int xstrlen(char *s) { int len=0; while(*s!='\0') { len++; s++; } return len; } void xstrcat(char *t,char *s,int j) { while(*t!='\0') { *t=*t; t++; } while(*s!='\0') { *t=*s; s++; t++; } }
最好将strcat
逻辑分解为单独的函数。 如果使用指针运算,则不需要strlen
函数:
#include #include #include /* To completely get rid of this, implement your our strcpy as well */ static void my_strcat (char* dest, char* src) { while (*dest) ++dest; while (*src) *(dest++) = *(src++); *dest = 0; } int main() { char* a1 = malloc(100); char* b1 = malloc(100); strcpy (a1, "Vivek"); strcpy (b1, " Ratnavel"); my_strcat (a1, b1); printf ("%s\n", a1); /* => Vivek Ratnavel */ free (a1); free (b1); return 0; }