Friday, 3 February 2017

string - my own strcat function using C errors



I'm basically coding my very own string functions in C.



I've been trying to do the strcat function using pointers and cannot seem to understand whether I should be allocating memory using malloc or leaving it up to the heap.



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


Any tips on more efficiently performing this task or things I'm doing wrong would be great!



Cheers



EDIT



OK so I got a working solution but just wondering after I use malloc where should I free() it?



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

Answer



First, I assume that the allocation is commented out by mistake.




  • You need to save the pointer that you allocate, and return it. Otherwise, you're returning a pointer string, which points at the end of the concatenation result

  • You are not terminating the resultant string; you need to add *string = '\0'

  • You should move the second loop to the outside of the first loop, and drop the if condition around it: if the first loop has terminated, you know that *p1 points to \0






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

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...