Reputation: 1
I wrote a program for handling command line inputs. I am having a segmentation error during memcpy() function when long strings are used as the input.
Here is the code:
int main(int argc, char * argv[])
{
// initialize input variables
char inputFileName[] = "sequence.txt"; //default input file name
//check if a different file name is given
for(int i = 0; i < argc-1; i++){
if(string(argv[i])=="-i"){
cerr << "string: " << string(argv[i+1]).c_str() << endl;
cerr << "string size: " << string(argv[i+1]).size() << endl;
inputFileName[string(argv[i+1]).size()]=0;
cerr << "filename: " << inputFileName << endl;
memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());
cerr << "filename after memcpy: " << inputFileName << endl;
break;
}
}
}
When a short file name is given (-i sequence.fasta) it works properly:
$ ./Program -i sequence.fasta
string: sequence.fasta
string size: 14
filename: sequence.txt
filename after memcpy: sequence.fasta
filename final: sequence.fasta
However a long name causes a segmentation fault:
$ ./Program -i sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta
string: sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta
string size: 86
filename: sequence.txt
Segmentation fault: 11
Am I missing something? How should I handle memcpy()?
Upvotes: 0
Views: 544
Reputation: 310990
Apart from that the size of array
char inputFileName[] = "sequence.txt";
is fixed and equal to 13 your code has another bug. When you execute memcpy
memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());
then you do not copy the terminating zero because expression string(argv[i+1]).size()
does not take it into account.
Upvotes: 0
Reputation: 49986
This is your problem:
inputFileName[string(argv[i+1]).size()]=0;
inputFileName has predefined size equals to strlen("sequence.txt") + 1 == 12bytes + 1byte for '\0'
char inputFileName[] = "sequence.txt"; //default input file name
so if you index it using string(argv[i+1]).size() then behaviour is undefined, if argv[i+1] is longer than 13.
You should use std::string, as a buffer
Upvotes: 1