我无法在C语言中连接字符串,没有strcat库函数。这是我的代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
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吗?
答案 0 :(得分:4)
char a1[] = "Vivek";
将创建大小为a1
的char数组6
。你试图用更多的字符来填充它。
如果您希望能够容纳连接"Vivek"
和"Ratnavel"
,则需要使用大小至少14 (5 + 8 + 1)
的字符数组。
在已修改计划中,您正在执行以下操作:
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<strlen(b1)-1
也不会复制字符串中的最后一个字符,将其更改为i<strlen(b1)
并且
a1[i]='\0';
应该是
a1[i + len]='\0';
因为a1
的新长度为i+len
,您需要在该索引处拥有NUL字符。
完成使用后,不要忘记free
动态分配的内存。
答案 1 :(得分:4)
下面的旧答案
您可以使用strcpy
初始化字符串,就像在代码中一样,或者在声明char数组时直接初始化。
char a1[100] = "Vivek";
除此之外,你可以做char-by-char
a1[0] = 'V';
a1[1] = 'i';
// ...
a1[4] = 'k';
a1[5] = '\0';
或者您可以编写几行替换strcpy
的代码并使其成为函数或直接在主函数中使用。
旧答案
你有
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
。
你能用什么替代它们?当你回答这个问题时,你已经解决了你遇到的编程问题:)
答案 2 :(得分:1)
您无法安全地写入这些数组,因为您尚未确定有足够的空间可用。如果使用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()
一样糟糕,因为它不支持限制输出中使用的空间,它只是假设有足够的可用空间。
答案 3 :(得分:1)
问题:
length
不是函数。 strlen
是,但您可能不应该在循环中调用它 - b1
的长度不会改变我们,是吗?此外,它会返回size_t
,其大小可能与您平台上的int
大小相同,但不会签名。这可能(但通常不会)导致错误,但无论如何都应该正确。a1
只有足够的空间容纳第一个字符串,因为编译器不知道为字符串的其余部分分配额外的堆栈空间。如果您提供明确的尺寸,例如[100]
,则该尺寸应足以满足您的需要。如果你需要健全的代码而不是对“足够”的假设做出假设,你应该调查malloc
和朋友,尽管这可能是另一天的教训。i < b1_len
(假设您有一个变量b1_len
,在循环开始之前设置为b1
的长度)就足够了 - strlen
不计算{ {1}}最后。'\0'
,在这种情况下,稍微更有效的实施可以使用'\0'
代替sizeof a1 - 1
,因为strlen(a1)
(和{{ 1}})被声明为数组,而不是指针。这是你的选择,但请记住a1
不适用于指针,所以不要混淆它们。b1
是个问题。带有指针的sizeof
不会复制内容,它会复制该值,因此您将丢弃从char *p = malloc(/*some*/); p = /* something */
获得的旧指针值。要将字符串的内容复制到=
(或malloc
),您需要使用char *
,char []
或(我的偏好){ {1}}。 (或者只是一个循环,但这很愚蠢。再说一遍,如果你自己写strcpy
,这可能是一个好习惯。)strncpy
的返回值,但这是一场宗教战争,我们不需要其中一种。如果您有memcpy
,请使用它。如果不这样做,这是一个有效的实现:
strcat
它是C标准库中最有用的功能之一。
答案 4 :(得分:1)
你也可以使用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"
答案 5 :(得分:0)
我认为这很容易。
#include<stdio.h>
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++;
}
}
答案 6 :(得分:-1)
最好将strcat
逻辑分解为单独的函数。如果使用指针算法,则不需要strlen
函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* 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;
}