我想读一个文件并计算单词。我希望它设置为所以我可以使用命令行,或者,如果在命令行上没有输入文件,则触发将获取文件名并读取它的if语句,然后计算单词。如果我在命令行中输入文件名,它就可以工作,但是如果我不使用它就会出错。这是代码:
int main(int argc, char **argv)
{
char file[75];
if (argc < 2)
{
cout << "Please enter the filename: ";
cin >> file;
strcpy(argv[1], file);
}
string content;
ifstream inFile(argv[1]);
int count = 0;
while (inFile >> content)
count++;
inFile.close();
display(count, argv);
return 0;
}
答案 0 :(得分:3)
您不应该修改argv
的数据,特别是超出范围。你的逻辑应该相反:
char file[75];
if (argc < 2)
{
cout << "Please enter the filename: ";
cin >> file;
} else
strcpy( file, argv[1] );
string content;
ifstream inFile(file);
但您最好还将std::string
用于变量file
。
同样cin >>
只输入单词(不包括空格符号),但文件名可以包含它们,因此如果将cin.getline( file )
更改为{{1},最好使用std::getline( cin, file )
或file
}}
答案 1 :(得分:1)
如果条件为真,即argc
确实小于2,则一般情况下argc
等于1,并且根据C标准argv[argc]
等于{{ 1}}。
因此,本案例中的程序具有未定义的行为。
在任何情况下,将字符串复制到argv [n]是个坏主意,其中n是某个索引,因为源字符串可能大于目标字符串。
您可以使用反向方法将NULL
复制到argv[1]
。