【问题标题】:my own strcat function using C errors我自己的 strcat 函数使用 C 错误
【发布时间】:2012-08-29 03:46:52
【问题描述】:

我基本上是在用 C 编写我自己的字符串函数。

我一直在尝试使用指针执行 strcat 函数,但似乎无法理解我应该使用 malloc 分配内存还是将其留给堆。

char *my_strcat(const char *s1, const char *s2)
{


    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    unsigned char *string;
        //string = malloc(strlen(s1) + strlen(s2) + 1);
    while (*p1 != '\0')
{
        *string = *p1;
        string++;
        p1++;

        if(*p1 == '\0')
        {
            while(*p2 != '\0')
            {
                *string = *p2;
                string++;
                p2++;
            }
        }
    }
    return (char *)string;  
}

任何有关更有效地执行此任务或我做错的事情的提示都会很棒!

干杯

编辑

好的,所以我得到了一个可行的解决方案,但只是想知道在我使用 malloc 之后我应该在哪里释放()它?

char *my_strcat(const char *s1, const char *s2)
{


    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    char *string = malloc(sizeof(char *));
    char *res = string;

    while (*p1 != '\0')
{
        *string = *p1;
        string++;
        p1++;
    }
    while (*p2 != '\0')
    {
        *string = *p2;
        string++;
        p2++;
}
    *string = '\0'; 

    return (char *)res; 
}

【问题讨论】:

  • 最好实现 strncat...strcat() 是应用程序中堆栈溢出漏洞的主要来源。
  • 如何从 strcat() 获得 Stack Overflow?我理解缓冲区溢出,但是...
  • string 需要指向p2 的末尾。 PS 未初始化 string 不会“将其留在堆中”。
  • @MarcB:标准的strncat()函数有一个设计用来触发错误的接口;太可怕了。
  • @JonathanLeffler 我将一个字符串附加到目标字符串的末尾。我认为,如果您仔细观察,我大致做对了,因为这适用于数组...我要求提示...

标签: c string strcat


【解决方案1】:

首先,我假设分配被错误地注释掉了。

  • 您需要保存分配的指针并将其返回。否则,您将返回一个指针 string,它指向连接结果的 end
  • 您没有终止结果字符串;你需要添加*string = '\0'
  • 您应该将第二个循环移到第一个循环的外部,并在其周围删除if 条件:如果第一个循环已终止,您知道*p1 指向\0

char *string = malloc(strlen(s1) + strlen(s2) + 1);
char *res = string;
for (; *p1 ; *string++ = *p1++);
for (; *p2 ; *string++ = *p2++);
*string = '\0';
return res;  

【讨论】:

  • 标准的strcat()函数不分配内存。
  • 另外:malloc 可以返回 NULL,所以检查一下可能是个好主意。如果您收到char *string = malloc... 行的警告,则显式转换为(char*) 将使其消失。
  • @Alok。坚硬的。不错的收获。总结链接:警告来自不包括stdlib.h。 void 指针会自动提升为指向任何对象的指针。
  • @JonathanLeffler 我知道标准strcat 不会分配内存,但看起来“OP 的专属”my_strcat 会分配内存,所以我同意了 OP。
【解决方案2】:

strcat 不分配任何内存,所以如果你想完成同样的事情,那么你不需要使用 malloc。

char* strcat(char* destination,char* source) {
 int c = 0;
 int sc;

 while(destination[c] != 0) {  c++; }

 for(sc = 0;sc < strlen(source);sc++) {
  destination[sc+c] = source[sc];
 }

 destination[sc+c] = 0;

 return destination;

}

【讨论】:

    【解决方案3】:

    这对我有用。

    char* my_strcat(char* a,char* b)
    {
            int i,j;
    
            for(i=0;a[i];i++);
            for(j=0;b[j];j++,i++)
             a[i]=b[j];
            a[i]='\0';
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2016-03-02
      相关资源
      最近更新 更多