繁体   English   中英

C中的串联程序

[英]concatenation program in C

我已经编写了一个用于连接两个字符串的程序,并且在运行时在for循环中的行s1 [i + j] = s2 [j]上抛出了分段错误。。。。。为什么会这样呢....请亲切地告诉我,我要去哪里错了。

char* concatenate(char *s1, char *s2)
{
   int i,j=0;

   for(i=0; s1[i] != '\0'; i++);
   for(j=0; s2[j] != '\0'; j++)
   {
      s1[i+j] = s2[j];
   }
   s1[i+j] = s2[j];

   return s1;
}

   char *s1 = (char *) malloc(15);;
   char *s2 ;

   s1 = "defds";
   s2 = "abcd";

   s1 = concatenate(s1,s2);
//   printf("\n\n%s\n\n",s1);
s1 = "rahul";

该行不会将字符串“ rahul”复制到s1指向的缓冲区中; 它重新分配指针s1指向(不可修改的)字符串文字“ rahul”

您可以通过使用两次concatenate函数来获得所需的功能:

char *s1 = (char *) malloc(15);

s1[0] = '\0'; // make sure the buffer is a null terminated string of length zero
concatenate(s1, "rahul");
concatenate(s1, "bagai");

请注意, concatenate函数仍然有些不安全,因为它像strcat一样盲目地复制字节。 您可能想要非常确定传递给它的缓冲区足够大,或者要修改它以使其像strncat采用的缓冲区长度一样。

当你做s1 = "rahul"; 您正在覆盖刚分配的内存。 该行不会将“ rahul”复制到已分配的区域,而是将s1更改为指向字符串常量“ rahul”,并丢弃指向已分配的内存的指针。

相反,您应该使用strcpy将字符串复制到malloc的区域:

// s1 = "rahul";
strcpy(s1, "rahul");

由于s1现在将指向正确的15字节内存区域,因此这将使您的concatenate调用更容易。

或者,您可以避开动态分配,并一次分配+分配初始字符串:

char s1[15] = "rahul";

这将在堆栈上分配15个字节,然后将“ rahul”复制到该空间中。 请注意此处的微妙之处。 在这种情况下,实际上使用=是正确的,而将s1声明为char *s1则是不正确的。

您可以从中学到的一个重要的调试课程是,当程序在特定的代码行上崩溃时,这并不意味着错误所在。 通常,您会在程序的一部分中犯一个错误,并且直到稍后,该错误才会在崩溃中显现出来。 这是使调试如此令人沮丧的过程的一部分!

您不必编写自己的字符串连接,标准库中已经有函数可以为您完成此任务!

#include <string.h>

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

在第二段代码中,分配大小为15的缓冲区,然后将其分配给s1。 然后,将“ rahul”分配给s1,这会泄漏刚分配的内存,并将s1分配给您可能无法写入的6字节内存。 更改s1 = "rahul"; strcpy( s1, "rahul" ); 可能会带来更好的运气。

我同意其他答案,但是连接功能很危险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM