gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:12 24 4
gpt4 key购买 nike

我试图让程序检查,如果用户没有输入任何内容,打印语句会说它找不到文件名,但我遇到的问题是命令行只会转到一个新的按回车后的行而不是说 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");
}
}

我试图测试的是,如果输入了第一个文件名,而第二个文件名没有输入,则打印该语句。如果两者均未输入,则打印文件不存在。代码还有更多内容来查看文件是否存在,但这有点多,现在我只是想理解为什么它不会读取未输入的数据。我尝试过查看以下示例:How to detect empty string from fgets并试图更改代码以适应这种类型的风格,但它对我不起作用,所以我给你原来的代码,这样任何有用的东西都不会让我更加困惑。

编辑:好的,所以我尝试编写一个简单的代码来看看导致此问题的原因:

   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 (space) adam 或 adam(enter) adam,程序会认为输入不一样,我觉得这将有助于确定为什么它不知道为什么什么都没有输入。

最佳答案

当您尝试检查 fInName == NULL 时,就会出现问题。

问题是 fInName 只是一个变量,您用它来存储要打开的文件的名称。您实际上想要检查的是用户给了您一个有效文件名,为此您需要了解返回值的函数是。

例如,当您尝试使用 fopen() 打开文件时,如果 fopen() 无法成功打开该文件,比如因为用户没有打开该文件如果不输入任何内容或拼写错误的文件名,则 fopen() 将返回 NULL,并将其存储在您分配给它的任何变量中(在您的情况下,*fin*fout)。

此外,不建议将 scanf() 用于 char 数组,因为如果用户输入的数据超过为数组分配的数据,在本例中,该空间足以用于50 个字符,那么 scanf() 将尝试将数据写入不属于您的内存,从而导致缓冲区溢出。

更安全的选择是使用 fgets(),因为您可以准确选择将多少数据写入 char 数组,唯一的缺点是 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");
}
}

关于使用 char 数组检查用户在 C 中是否输入空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36671488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com