Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我自己的strcat函数使用C错误_C_String_Strcat - Fatal编程技术网

我自己的strcat函数使用C错误

我自己的strcat函数使用C错误,c,string,strcat,C,String,Strcat,我基本上是用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; unsigne

我基本上是用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; 
}

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;

}

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;

}

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

您需要保存分配的指针并返回它。否则,将返回一个指针字符串,该字符串指向连接结果的末尾 您没有终止结果字符串;您需要添加*字符串='\0' 您应该将第二个循环移动到第一个循环的外部,并删除其周围的if条件:如果第一个循环已终止,则您知道*p1指向\0
首先,我假设分配被错误地注释掉了

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

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';

}
这对我有用

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';

}

你最好实施strncat。。。strcat是应用程序堆栈溢出漏洞的主要来源。如何从strcat获得堆栈溢出?我理解缓冲区溢出,但是…字符串需要指向p2的结尾。PS未初始化字符串不会将其留给堆。@MarcB:标准strncat函数有一个用于触发错误的接口;这太可怕了。@JonathanLeffler我在目标字符串的末尾追加一个字符串。我想如果你仔细看一下,我大致上做对了,因为这与数组有关。。。我问了一些建议…你最好还是实施strncat。。。strcat是应用程序堆栈溢出漏洞的主要来源。如何从strcat获得堆栈溢出?我理解缓冲区溢出,但是…字符串需要指向p2的结尾。PS未初始化字符串不会将其留给堆。@MarcB:标准strncat函数有一个用于触发错误的接口;这太可怕了。@JonathanLeffler我在目标字符串的末尾追加一个字符串。我想如果你仔细看一下,我大致上做对了,因为这与数组有关。。。我问了一些提示…标准strcat函数没有内存分配。另外:malloc可以返回NULL,所以检查一下这个可能是个好主意。如果您收到char*string=malloc的警告。。。行,对char*进行显式转换将使其消失。@Nathan@Alok。固体接得好。总结一下链接:警告来自不包括stdlib.h。无效指针会自动升级为指向任何对象的指针。@JonathanLeffler我知道标准strcat不分配内存,但它看起来像是OP自己的my_strcat,所以我同意OP。标准strcat函数不分配内存。另外:malloc可以返回NULL,因此,检查一下这一点可能是个好主意。如果您收到char*string=malloc的警告。。。行,对char*进行显式转换将使其消失。@Nathan@Alok。固体接得好。总结一下链接:警告来自不包括stdlib.h。无效指针会自动升级为指向任何对象的指针。@JonathanLeffler我知道标准strcat不分配内存,但它看起来像是OP自己的,我的strcat要分配内存,所以我同意OP的说法。