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

检查用户是否使用char数组在C中输入空字符串,c,arrays,string,null,user-input,C,Arrays,String,Null,User Input,我正在尝试让程序检查,如果用户没有输入任何内容,print语句会说它找不到文件名,但我遇到的问题是,在点击enter之后,命令行将转到一个新行,而不是说print语句。 这是这里的代码。有人告诉我,如果没有输入任何内容,Null是占位符,所以我认为它会起作用 int main() { FILE *fin; FILE *fout; char fInName[50]; char fOutName[50]; printf("pleas type input file, and output file

我正在尝试让程序检查,如果用户没有输入任何内容,print语句会说它找不到文件名,但我遇到的问题是,在点击enter之后,命令行将转到一个新行,而不是说print语句。 这是这里的代码。有人告诉我,如果没有输入任何内容,Null是占位符,所以我认为它会起作用

int main()
{
FILE *fin;
FILE *fout;
char fInName[50];
char fOutName[50];
printf("pleas type input file, and output file please type legibly\n ");

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");
 }
}
我要测试的是,如果输入了第一个文件名,而第二个文件名没有,那么打印语句。如果两者都未输入,则打印文件不存在。 有更多的代码来查看文件是否存在,但这将是一个有点多,现在我只是想了解为什么它不会读取未加密的数据。 我试着看一些例子,比如: 并试图改变代码,以适应这种类型的风格,但它没有为我工作,所以我给你的代码,它原来是这样,任何有帮助的不会让我更困惑

编辑: 好的,我试着编写一个简单的代码,看看这个问题的原因是什么:

   int main()
{
    char firstname[50];
    char lastname[50];
    char nothing [0];


    printf("pleas type input file, and output file please type legibly pwease\n ");
    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()
用于字符数组,因为如果用户输入的数据多于为数组分配的数据(在本例中为50个字符留出了足够的空间),则
scanf()
将尝试将不属于您的数据写入内存,从而导致缓冲区溢出

一个更安全的选择是使用
fgets()
,因为您可以选择将多少数据写入字符数组,唯一的缺点是
fgets()
将写入换行字符
\n
(由按enter键引起)但简单的解决方案是用“\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")] = '\0';
    }
    // 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")] = '\0';
    }
    // 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");
    }
}
int main(无效)
{
char-fInName[50];
char fOutName[50];
//确保正确使用
做
{
printf(“您想打开什么文件?”);
//从用户处获取内嵌并删除尾随换行符“\n”
fgets(芬兰名称,50,标准名称);
fInName[strcspn(fInName,“\n”)]='\0';
}
//提示输入,直到用户输入内容
而(strlen(fInName)<1);
做
{
printf(“您希望输出到哪个文件?”);
//从用户获取outfile并删除尾随换行符“\n”
fgets(fOutName,50,标准名称);
fOutName[strcspn(fOutName,“\n”)]='\0';
}
//提示输入,直到用户输入内容
while(strlen(fOutName)<1);
文件*fin=fopen(fInName,“r”);
如果(fin==NULL)
{
printf(“错误:无法打开输入文件%s.”,fInName);
返回1;
}
其他的
{
printf(“找到文件”);
}
}

首先应该是if(fInName==NULL | | fOutName==NULL)和if(fInName!=NULL&&fOutName!=NULL)在第二部分中,您可能应该检查
scanf
的返回值。如果它无法获取您的两个字符串,
fInName
fOutName
的值将是在您进行调用之前在它们中发生的任何随机事件。此时的行为可能是很多事情,因为您基本上是试图打开两个随机名称的文件,可能存在,也可能不存在。
fInName
fOutName
都不会为空;它们都是数组名,数组名永远不等于空指针。(注意:函数的参数是指针,而不是真正的数组-指针当然可以为空。)您应该检查
scanf()中的返回值
;如果上面写着2,那么你有两个文件名;否则,你会遇到一些问题。请注意,如果你有两个名称,那么这两个名称都不是空字符串。在尝试打开文件之前,你也应该检查文件名。请注意,你应该在请求之前加上“请”。关于此文本:
请清晰地键入
用户将在某种键盘上键入。它怎么可能不清晰?实际上,像:
Adam
这样的输入会由于尾随NUL(“\0”)而占用5个字节/空格字符。如果
fout
为空,则错误消息不准确。理想情况下,您应该在stderr上报告错误。消息应该以换行结束。并且
“找到的文件”
应该说明是哪个文件。您应该检查
scanf()的结果
。嘿,我试过了,我也遇到了同样的问题。我无法真正弄清楚为什么我试图保留尽可能多的原始代码,却遗漏了可能会导致错误的其他内容。最初它说“如果(fin==NULL | | fout==NULL)”但是你不想检查fout是否为NULL,因为在那一点上你还没有创建fout,所以不管它是NULL。我已经更新了我的代码,现在应该可以检查填充是否有效并成功打开。另外,你是否打算使用fout在其中写入fin的内容?因为如果