字符串连接在C中没有strcat

时间:2010-12-14 11:15:21

标签: c string

我无法在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吗?

7 个答案:

答案 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];
}

现在考虑上面循环中的514

你能用什么替代它们?当你回答这个问题时,你已经解决了你遇到的编程问题:)

答案 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)

问题:

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