字符串连接在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]; } 

现在想想上面循环中的514

你有什么可以取而代之的? 当你回答这个问题时,你已经解决了你的编程问题:)

  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()一样糟糕,因为它不支持限制输出中使用的空间,它只是假设有足够的可用空间。

问题:

  1. length不是一个function。 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 */ 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标准库中最有用的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; }