如何创建strcat的副本?

时间:2016-10-11 09:20:03

标签: c

我必须在C中创建标准库的一些元素的副本,我必须创建一个strcat的副本。所以我必须创建一个在C中连接两个字符串的函数。我知道C中的数组不能改变分配的大小。我允许使用的唯一功能是我使用strlen,strstr和write()创建的副本......我的代码如下所示:

char    *my_strcat(char *dest, char *src)
{
    int  dest_size;
    int  src_size;
    int  current_pos;
    int  free_space;
    int  pos_in_src;

    src_size = my_strlen(src);
    dest_size = my_strlen(dest);
    while (dest[current_pos] != '\0')
        current_pos = current_pos + 1;
    free_space = dest_size - current_pos;
    if (free_space < src_size)
        return (0);
    while (src[pos_in_src] != '\0')
    {
        dest[current_pos] = src[pos_in_src];
        pos_in_src = pos_in_src + 1;
        current_pos = current_pos + 1;
    }
    return (dest);
}

但我不知道如何在主要声明我的dest和src。 我不知道如何创建一个大尺寸的数组,将其声明为一个字符串,如dest =&#34; Hello \ 0&#34;但是这个数组仍然必须包含6个以上的字符。

你能帮我吗?

3 个答案:

答案 0 :(得分:2)

char dest[19] = "epite";
char *src = "chor42spotted";

my_strcat(dest, src);

另请阅读man

strcat(3)
  

dest字符串必须有足够的空间用于结果。

https://linux.die.net/man/3/strcat

因此,您的功能行为不正确,您无需检查dest

中是否有足够的可用空间

答案 1 :(得分:1)

你想要一个函数mystrcat,其行为与stdlib strcat完全相同。

所以原型是

 /*
    concatenate src to dest
    dest [in / out] - the string to add to (buffer must be large enough)
    src [in] - the string to concatenate.
    Returns: dest (useless little detail for historical reasons). 
 */
 char *mystrcat(char *dest, const char *src);

现在我们称之为

int main(void)
{
 char buff[1024];  // nice big buffer */

 strcpy(buff, "Hello ");
 mystrcat(buff, "world");

 /* print the output to test it */
 printf("%s\n", buff);

 return 0;
} 

但我不会为你写mystrcat。这会使你的家庭作业毫无意义。

答案 2 :(得分:1)

数组的第一个参数必须足够大才能包含两个字符串+一个空终止符。因此,如果您有"hello""world",则需要5 + 5 +1 = 11个字符。例如:

#define LARGE_ENOUGH 11

int main (void)
{
  char str[LARGE_ENOUGH] = "hello";
  my_strcat(str, "world");
  puts(str); // gives "helloworld"
}

在实际应用程序中,您通常会为数组分配相同的大数(几百个字节)或基于strlen调用的长度。

至于实施本身,你的解决方案是不必要的复杂。请注意,真实的strcat会将所有错误检查留给调用者。它最有可能像这样实现:

char* strcat (char* restrict s1, const char* restrict s2)
{
  return strcpy(&s1[strlen(s1)], s2);
}

这里最重要的部分是注意s2参数的const正确性。

restrict关键字只是来自C标准的微优化,它告诉编译器它可以假设指针指向不同的内存区域。

如果您希望推出自己的版本而没有库函数调用只是为了好玩,它仍然相当容易,您只需要两个循环。也许是这样的事情:

char* lolcat (char* restrict s1, const char* restrict s2)
{
  char* s1_end = s1;
  while(*s1_end != '\0') // find the end of s1
  {
    s1_end++;
  }

  do // overwrite the end of s1 including null terminator
  {
    *s1_end = *s2;
    s1_end++;
    s2++;
  } while(*s1_end != '\0'); // loop until the null term from s2 is copied

  return s1;
}