我正在尝试让程序检查,如果用户什么都没输入,print语句会说它找不到文件名,但我遇到的问题是,命令行在点击回车后会转到新行,而不是说print语句。这是这里的代码。有人告诉我,如果什么都不放,Null就是占位符,所以我认为它会起作用。
int main()
{
FILE *fin;
FILE *fout;
char fInName[50];
char fOutName[50];
printf("pleas type input file, and output file please type legiblyn ");
scanf("%s %s", &fInName, &fOutName);
fin = fopen(fInName, "r");
fout = fopen(fOutName, "r");
if (fInName == NULL && fOutName == NULL)
{
printf("Error: Cannot open input file %s.", fInName);
}
else if (fInName != NULL && fOutName == NULL)
{
printf("file found");
}
}
我想测试的是,是否输入了第一个文件名,而第二个没有,然后打印语句。如果两者都未输入,则打印文件不存在。代码中还有更多内容可以查看文件是否存在,但这可能有点多,现在我只是想理解为什么它不会读取未经过滤的数据。我试着看了一些例子,比如:如何从fgets中检测空字符串并试图修改代码以适应这种类型的风格,但它对我不起作用,所以我给你最初的代码,这样任何有用的东西都不会让我更困惑。
编辑:好的,所以我试着做一个简单的代码,看看这个问题的原因是什么:
int main()
{
char firstname[50];
char lastname[50];
char nothing [0];
printf("pleas type input file, and output file please type legibly pweasen ");
scanf("%s" "%s", firstname, lastname);
if (firstname == lastname )
{
printf("Error: Cannot open input file %s.", firstname);
}
else
{
printf("file found");
}
}
我使用adam运行代码,如果我键入adam(空格)adam或adam(回车)adam,程序会认为输入不一样,我觉得这将有助于确定为什么它不知道为什么什么都没有键入。
当您尝试检查fInName == NULL
时,会出现问题。
问题是fInName
只是一个用于存储要打开的文件名的变量。实际上想要检查的是用户是否为您提供了有效的文件名,为此,您需要了解函数的返回值是什么。
例如,当您尝试使用fopen()
打开文件时,如果fopen()
无法成功打开该文件,例如因为用户没有输入任何内容或拼错了文件名,那么fopen()
将返回NULL
,并将其存储在您分配给它的任何变量中(在您的情况下,为*fin
和*fout
)。
此外,不建议将scanf()
用于char数组,因为如果用户输入的数据比您为数组分配的数据多,在这种情况下,这足够容纳50个字符,那么scanf()
将尝试将数据写入非您的内存,从而导致缓冲区溢出。
一个更安全的选择是使用fgets()
,因为您可以准确地选择向char数组中写入多少数据,唯一的缺点是fgets()
会向数组中写入换行符n
(由按下回车键引起),尽管简单的解决方案是用"\0"覆盖换行符。
因此,我建议:
int main(void)
{
char fInName[50];
char fOutName[50];
// ensure proper usage
do
{
printf("What file would you like to open? ");
// get infile from user and remove trailing newline 'n' character
fgets(fInName, 50, stdin);
fInName[strcspn(fInName, "n")] = ' ';
}
// prompt for input until user enters something
while (strlen(fInName) < 1);
do
{
printf("What file would you like to output to? ");
// get outfile from user and remove trailing newline 'n' character
fgets(fOutName, 50, stdin);
fOutName[strcspn(fOutName, "n")] = ' ';
}
// prompt for input until user enters something
while (strlen(fOutName) < 1);
FILE *fin = fopen(fInName, "r");
if (fin == NULL)
{
printf("Error: Cannot open input file %s.", fInName);
return 1;
}
else
{
printf("file found");
}
}