我想读取一个文件并数单词。我希望对其进行设置,以便我可以使用命令行,或者,如果未在命令行上输入文件,则触发一个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;
}
您不应该修改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 >>
输入的单词(不包括空格符号),但文件名可以包含它们,因此如果将file
更改为std::string
,则最好使用cin.getline( file )
或std::getline( cin, file )
如果条件为真,即如果argc
确实小于2,那么在一般情况下argc
等于1,根据C标准argv[argc]
等于NULL
。
因此,在这种情况下,程序具有未定义的行为。
在任何情况下,将字符串复制到 argv[n] 都是一个坏主意,其中 n 是某个索引,因为源字符串可能大于目标字符串。
您可以使用反向方法,即将argv[1]
复制到file
。