Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets引入用户新产品线';s输入_C_String_File_Fgets - Fatal编程技术网

C fgets引入用户新产品线';s输入

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

我会提示用户输入文件名,但一旦用户按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 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()返回值中没有任何内容提示缓冲区已满。请叫我偏执狂,但我担心缓冲区溢出情况是偶然或故意造成的。