Copy of a string

Please tell me how I can make a copy of a given string, at run time.

If my function takes char *str as a parameter, then I want make a local copy of str within the function.

Thanks!
dshrenikAsked:
Who is Participating?
 
Peter KwanAnalyst ProgrammerCommented:
You can do it this way (pseudo-code only):
char *new_str;
int i = 0;
new_str = (char*) malloc(sizeof(char));
new_str[i] = orig_str[i];
while (orig_str[i] != NULL) {
     new_str = (char*)realloc(new_str, (i+2)*sizeof(char));
     new_str[i] = orig_str[i];
     i++;
} 
new_str[i]=0;

Open in new window

0
 
Peter KwanAnalyst ProgrammerCommented:
0
 
dshrenikAuthor Commented:
I don't want to use library functions.

Will it work if I find the length of the string, then dynamically allocate a char array and assign its value to the original?

If possible, please provide some sample code.

Thanks!
0
 
Deepu AbrahamR & D Engineering ManagerCommented:
another way if implementing this . here is the snippet
char* strcpy_new(char* dest,const char* source)
{
	if ((dest == NULL)|| (source == NULL))
		return NULL;
        //if you know the length then you could check it here..
	int i = 0;
	while(source[i]!='\0')
	{
		dest[i] = source[i];
		i++;
	}
	if(dest[i] != '\0')
		dest[i] = '\0';

	return dest;
}

Open in new window

0
 
hogwellCommented:
// A simpler, more efficient version that creates a copy of the input string on the heap.
char* copy_a_string(const char *str)
{
    const char *str1=str;
    size_t len;
    char *copy_of_str;
    char *str2;
    while (*str1) ++str1;
    len = str1 - str;
    copy_of_str = (char*) malloc((len+1)*sizeof(char)); // Or use "copy_of_str = new char[len+1];" in C++
    for (str1=str,str2=copy_of_str; *str1; )
      *str2++ = *str1++;
    *str2 = '\0';
    return copy_of_string;
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.