Question

I am passing an string or a char array to a function and swapping them but losing the first char array's value for some reason. Here is my code:

void foo(char* a, char* b){

         char* temp;

         temp = new char[strlen(a)+1];
         strcpy(temp, a);
         strcpy(a, b);
         strcpy(b, temp);

         delete[] temp;
}

So in foo the function gets passed two pointers and the are attempted to be swapped. Here is the main function. There may be a problem with the passing of the variable, but the compiler did not give me an issue.

int main(){

         char a[] = "First";
         char b[] = "Last";

         std::cout << "A Before: "<< a << "\n";
         std::cout << "B Before: " << b << "\n\n";

         foo(a, b);

         std::cout << "A After: "<< a << "\n";
         std::cout << "B After: "<< b << "\n\n";

         return 0;
}

The output I am getting is as follows:

A Before: first
B Before: last

A After: 
B After: first

Now I have tested the values of the strings while in the function during the strcpy's and turns empty after the final strcpy, which means, or at lest I think, that the problem lies within the pointers to the original variables. It could be a chain reaction type of thing where all of the pointers are pointing to the "a" and it confuses the program.

Any help would be appreciated, also why this is happening would be very useful as well.

Was it helpful?

Solution

Because your string a is longer than b.So strcpy does not work as you expect in line:

strcpy(b, temp);

Tips:

  • Use strncpy instead of strcpy
  • Use c++ Strings instead of the c style string.Then you can swap them with a.swap(b);

OTHER TIPS

The problem is your array sizes happen to be such that you are clobbering your stack; fortunately, for you, the effect is simply to place a null byte in the first character of a, making it an empty string.

#include <iostream>
#include <string.h>

void foo(char* a, char* b){
         char* temp = new char[strlen(a)+1];

         strcpy(temp, a);
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;

         strcpy(a, b);
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;

         strcpy(b, temp); // this copies 6 bytes to b, which puts a 0 in the first byte of a.
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;

         delete[] temp;
}

int main() {
     char a[] = "First";
     char b[] = "Last";

     std::cout << "a size is " << sizeof(a) << std::endl;
     std::cout << "b size is " << sizeof(b) << std::endl;

     std::cout << "address of a[0] is " << (void*)&a[0] << std::endl;
     std::cout << "address of b[0] is " << (void*)&b[0] << std::endl;

     foo(a, b);

     std::cout << "A After: "<< a << "\n";
     std::cout << "B After: "<< b << "\n\n";
}

http://ideone.com/fDvnnH

a size is 6
b size is 5
address of a[0] is 0xbfec5caa
address of b[0] is 0xbfec5ca5
temp = First a = First b = Last
temp = First a = Last b = Last
temp = First a =  b = First
A After: 
B After: First

You might want to investigate std::string or look at using std::strncpy

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top