C fgets引入用户新产品线';s输入
我会提示用户输入文件名,但一旦用户按enter键,它也会将其输入文件名。因此,该文件从未找到C fgets引入用户新产品线';s输入,c,string,file,fgets,C,String,File,Fgets,我会提示用户输入文件名,但一旦用户按enter键,它也会将其输入文件名。因此,该文件从未找到 int main (){ char file[100]; FILE *fp; printf("Please enter a valid filename:\n"); fgets(file,100,stdin); fp=fopen(file, "r"); if(!fp){ printf("File not found.\n"); \\This will always happen because a
int main (){
char file[100];
FILE *fp;
printf("Please enter a valid filename:\n");
fgets(file,100,stdin);
fp=fopen(file, "r");
if(!fp){
printf("File not found.\n"); \\This will always happen because a new line is added to the user's input.
return 1;}
如果我使用
scanf("%s", file);
这个问题没有发生,但我听说scanf不是一个好的函数,它会引入新的问题。如何使用fgets解决新行问题?在fgets(文件,100,stdin)之后代码>,执行此文件[strlen(file)-1]='\0'代码>,它将从代码中删除\n
。要使用strlen()
函数,您需要在代码中包含string.h
请尝试此修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (){
char file[100];
FILE *fp;
printf("Please enter a valid filename:\n");
fgets(file,100,stdin);
file[strlen(file)-1]='\0'; //Removing \n from input
fp=fopen(file, "r");
if(fp==NULL)
{
printf("File not found.\n");
return 1;
}
else
{
printf("File found!\n");
fclose(fp);
return 0;
}
}
#包括
#包括
#包括
int main(){
字符文件[100];
文件*fp;
printf(“请输入有效的文件名:\n”);
fgets(文件,100,标准文本);
文件[strlen(file)-1]='\0';//从输入中删除\n
fp=fopen(文件“r”);
如果(fp==NULL)
{
printf(“未找到文件。\n”);
返回1;
}
其他的
{
printf(“找到文件!\n”);
fclose(fp);
返回0;
}
}
fgets()返回\n新行代码。。。。它就是这样做的。你必须消灭那个角色
鉴于溢出或至少完全填充,传入缓冲区是一种流行的攻击向量,我更喜欢代码来抵御这种攻击。
char *cp;
file[(sizeof file)-1)] = '\0'; /* assure \0 termination on buffer fill attack */
cp = strchr( file, '\n' ); /* find expected \n, but allow for none */
if ( cp ) *cp = '\0'; /* safely clear closing \n */
char*cp;
文件[(文件大小)-1)]='\0';/*确保缓冲区填充攻击\0终止*/
cp=strchr(文件“\n”);/*需要查找\n,但不允许有*/
如果(cp)*cp='\0';/*安全地清除关闭\n*/但也请参见和,-1中的“此问题未显示任何研究工作”。A(即此问题的标题)将该重复项作为第三个结果显示。您的心脏位置正确,但\0
检查不会阻止读取未初始化的数据。相反,您可以检查fgets
的返回值。如果它重新运行NULL
,则根本不读取文件
;否则,您可以保证缓冲区包含字符串。挑战:您写评论已经有一段时间了,但您的文字中没有任何内容可以解决缓冲区已满的情况,这正是我要防范的。当然fgets()在EOF/Error时返回NULL,但这是另一个bug。我要防止最后\n\0没有发布的名称过长,因为它们会超出缓冲区的末尾。没有好的fputs()应该允许这样做(但我倾向于有两个额外的保护字节,以防出现bug fgets()。fgets()返回值中没有任何内容提示缓冲区已满。请叫我偏执狂,但我担心缓冲区溢出情况是偶然或故意造成的。