解析命令行参数时出现问题

时间:2013-08-17 13:58:39

标签: c++

这是我的代码:

#include <iostream>
#include <fstream>

using namespace std;

int main (int argc, char * argv[])
{
    char * inputFileName = new char ;
    char * outputFileName = new char ;
    *(inputFileName)='\0';
    *(outputFileName)='\0';
    if(argc!=3)
    {
            cout<<"\n\nWRONG SET OF ARGUMENTS!!\n\nSYNTAX:\n"<<endl;
            cout<<"\n./FileCp <SOURCE> <DESTINATION>\n"<<endl;
            return 1;
    }
    strcpy(inputFileName,argv[1]);
    strcpy(outputFileName,argv[2]);

    cout<<"Input File Name = "<<inputFileName<<endl ;
    cout<<"Output File Name = "<<outputFileName<<endl ;
}

这是我使用的命令:

./FileCp /Users/sumanthdamarla/Downloads/20130530_235557.jpg jkhs.jpg

这是输出:

Input File Name = /Users/sumanthdajkhs.jpg
Output File Name = jkhs.jpg

outputFileName正在覆盖inputFileName。 如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

char * inputFileName = new char ;
char * outputFileName = new char ;

这两行分别为每个字符分配一个字符。

strcpy(inputFileName,argv[1]);
strcpy(outputFileName,argv[2]);

这两行,至少复制2个字符(否则不会算作参数 - 参数不能为“空”)。

我建议您使用std::string而不是分配内存。然后你可以做outFilename = argv[2];而不必担心它的大小。

或者,如果您不打算将该名称用于除argv[2]以外更有意义的名称之外的任何名称,那么您只需声明const char *outFilename,并将其设置为{ {1}} - 但要注意不建议修改outFilename = argv[2];的内容,因为您不知道“背后”是什么。