Unexpected behavior from strcpy/strtok?

Nov 13, 2012 at 2:38pm
Hey folks, I have a program that is meant to read in lines from a text file, and split them into tokens around ", " using strtok(). So for instance, "WSAD, 1234" should be split into "WSAD" and then "1234". However, when I execute my code, I get a runtime error. I have spent quite a while looking at my code, but I still don't understand the problem. Could a kind soul look into it and tell me what I'm doing wrong? My code is below:


#include<iostream>
#include<fstream>

using namespace std;

int main()
{
string filename,obj;
cout<<"Please enter filename: ";
cin>>filename;

ifstream file;
file.open(filename.c_str());

if(!file)
{ cout<<"Error in opening file"<<endl;}

else
{
char* copy;
char* un, *deux;

while(getline(file,obj))
{
cout<<obj<<endl;
strcpy(copy, obj.c_str());//error occurs around or after here
un=strtok(copy,", ");
deux=strtok(NULL,", ");
}

}

return 0;
}//end of program


Thanks!
Nov 13, 2012 at 2:43pm
strcpy(copy, obj.c_str());//error occurs around or after here

This is an attempt to copy the letters from obj into the memory space pointed at by the pointer copy. Where is the pointer copy pointing?

Well, you created it like this:
char* copy;
so it starts out just pointing at some random memory somewhere, that could be anywhere, and that's it.

So you're trying to write over some random piece of memory somewhere that doesn't belong to your program, and the OS spots this and stops the program, as it should.

You have to make that pointer actually point at memory that is yours to write on.
Nov 13, 2012 at 2:44pm
Variable copy was not initialized

char* copy;

So this pointer points nowhere.
Nov 13, 2012 at 2:54pm
I see. Alright, any suggestions on a suitable way to initialize the pointer? I'm not allowed to use arrays of any kind for any reason, because this is for an assignment and that was a restriction my lecturer implemented.
Nov 13, 2012 at 3:10pm
Since we're coding like it's 1980, we could use malloc.

After reading in the string, you could do something like:
char* copy = (char*) malloc(obj.length()); which will definitely be enough space to strtok into.

I'd prefer new:
char* copy = new char[obj.length()]; but that would probably be taken as an array.

Don't forget to free anything you malloc.

Last edited on Nov 13, 2012 at 3:10pm
Nov 13, 2012 at 3:31pm
malloc worked. Thank you! Though now I'm curious, why do you say it's like the 80s?
Nov 13, 2012 at 3:43pm
Because C++ turned up with new in the eighties, and also brought with it a number of nicer ways to tokenise string objects than using the C function strtok.
Topic archived. No new replies allowed.