在C中没有strcat的字符串连接
我无法连接C中的字符串,没有strcat库函数。这是我的代码在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?
老回答以下
你可以在你的代码的时候直接初始化字符串strcpy
一样,或声明char数组。
char a1[100] = "Vivek";
除此之外,你可以做到这一点炭火由炭
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
。
什么可以替换它们?当你回答这个问题,你已经解决了你的规划问题:)
您不能安全地写入这些数组,因为您尚未确保有足够的空间可用。如果使用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()
糟糕,当涉及到缓冲区溢出,因为它不支持限制输出中使用的空间,它只是假定有足够的空间可用。
char a1[] = "Vivek";
将创建大小6
的字符数组a1
。你试图用更多的字符填充它,而不是它可以容纳的。
如果你想能够容纳连接"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
您的动态分配的内存。
问题:
-
length
不是一个函数。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 */
是一个问题。带指针的=
不复制内容,它复制值,所以你丢掉了你从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标准库中最有用的功能之一。
最好将您的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;
}
可以使用的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<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++;
}
}
为什么不使用strncat? – 2010-12-14 11:18:27
@ kotlinkski,因为它是作业,我猜 – 2010-12-14 11:19:53
不,我只是想知道,如何连接两个字符串而不使用任何库函数。可能是保罗是对的。我正在准备测试。 – Vivek 2010-12-14 11:20:26