在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?

+0

为什么不使用strncat? – 2010-12-14 11:18:27

+0

@ kotlinkski,因为它是作业,我猜 – 2010-12-14 11:19:53

+0

不,我只是想知道,如何连接两个字符串而不使用任何库函数。可能是保罗是对的。我正在准备测试。 – Vivek 2010-12-14 11:20:26

老回答以下


你可以在你的代码的时候直接初始化字符串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]; 
} 

现在想想上面的循环中514

什么可以替换它们?当你回答这个问题,你已经解决了你的规划问题:)

+0

我认为5是strlen(a )和14是strlen(a)+ strlen(b)。但是我在我的代码中做了相同的逻辑,并且出现了分段错误。我该如何解决它? – Vivek 2010-12-14 11:46:57

+0

您的代码没有'a1'和'b1'最后额外的空间,你为100个字符分配空间,但是忽略这个空间并且让a1指向一个没有额外空间的字符(不可修改)('a1 =“Vivek”;')。 – pmg 2010-12-14 11:51:55

+0

但我怎么能做到这一点的char *分配内存? – Vivek 2010-12-14 12:30:47

您不能安全地写入这些数组,因为您尚未确保有足够的空间可用。如果使用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您的动态分配的内存。

+0

我改了我的代码,请检查一下 – Vivek 2010-12-14 11:22:01

+0

我很感谢你的回复,但我们是否也可以不使用strcpy(),我们可以用其他方式来做,这样我们的代码就不会有任何库函数。我的代码。请检查。谢谢你的回复。+1 – Vivek 2010-12-14 12:21:47

+0

'malloc'和'strcpy'确实是一个超调:'a1 [100] =“Vivek”;'已经足够了 – Vovanium 2010-12-14 13:28:04

问题:

  1. length不是一个函数。 strlen是,但你可能不应该把它称为一个循环 - b1的长度不会改变我们,是吗?此外,它还会返回一个size_t,它可能与您的平台上的int大小相同,但是会被未签名。这可以(但通常不会)导致错误,但是无论如何你都应该这样做。
  2. a1只对第一个字符串足够的空间,因为编译器不知道要分配额外的堆栈空间以来的字符串的其余部分。如果你提供一个明确的大小,如[100],这应该足够你的目的。如果你需要健壮的代码,并不能假设什么是“足够”,你应该看看malloc和朋友,尽管这可能是另一天的教训。
  3. 您的循环过早停止。 i < b1_len(假设你有一个变量,b1_len,这是设置为b1长度循环开始之前)就足够了 - strlen不会在计数结束时,'\0'
  4. 但最后计数'\0'发言,稍微更有效的实现可能会在这种情况下使用sizeof a1 - 1,而不是strlen(a1),因为a1(和b1)被定义为数组,不是指针。这是你的选择,但请记住sizeof不适用于指针,所以不要让它们混淆。
    编辑:新问题:
  5. char *p = malloc(/*some*/); p = /* something */是一个问题。带指针的=不复制内容,它复制值,所以你丢掉了你从malloc得到的旧指针值。为字符串的内容复制到char *(或为此事char []),你需要使用strcpystrncpy,或(我偏好)memcpy。 (或者只是一个循环,但这很愚蠢,再次,如果你自己编写了strcat,这可能是一个好习惯。)
  6. 除非你使用C++,否则我不会施加返回值malloc,但这是一场宗教战争,我们不需要其中之一。
  7. 如果您有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++; 
    } 
}