检查用户是否使用char数组在C中输入了一个空字符串



我正在尝试让程序检查,如果用户什么都没输入,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");
    }
}

相关内容

  • 没有找到相关文章

最新更新