“问题”';字符*';但参数的类型为';字符(*)[1]'&引用; 文件*fd; 字符文件名称[]=“”; printf(“输入要保存结果的文件名。\n”); printf(“不要忘记文件必须以.exe结尾\n”); scanf(“%s”&文件名); while(strchr(文件名,'.txt')==NULL) { printf(“文件名的结尾不正确。请重试。\n”); printf(“文件名:”); scanf(“%s”&文件名); }

“问题”';字符*';但参数的类型为';字符(*)[1]'&引用; 文件*fd; 字符文件名称[]=“”; printf(“输入要保存结果的文件名。\n”); printf(“不要忘记文件必须以.exe结尾\n”); scanf(“%s”&文件名); while(strchr(文件名,'.txt')==NULL) { printf(“文件名的结尾不正确。请重试。\n”); printf(“文件名:”); scanf(“%s”&文件名); },c,warnings,C,Warnings,警告: format指定类型“char”,但参数的类型为“char()[1]”[-Wformat] scanf(“%s”&文件名); ~~~~^~~~~~~~~~ 箭头指向“&文件名” 如何修复它?谢谢。scanf()希望char*用于%s 文件名的类型为char[1],因为它是一个元素数组,并且元素初始化为'\0' 表达式中的大多数数组都转换为指针,但其中一个例外是一元操作数&(本例) 因此,&File\u name成为指向数组的指针,其类型为char(*)[1] 要修复此问题,请删除文件名之

警告: format指定类型“char”,但参数的类型为“char()[1]”[-Wformat] scanf(“%s”&文件名); ~~~~^~~~~~~~~~

箭头指向“&文件名”

如何修复它?谢谢。

scanf()
希望
char*
用于
%s

文件名
的类型为
char[1]
,因为它是一个元素数组,并且元素初始化为
'\0'

表达式中的大多数数组都转换为指针,但其中一个例外是一元操作数
&
(本例)

因此,
&File\u name
成为指向数组的指针,其类型为
char(*)[1]

要修复此问题,请删除
文件名
之前的
&
s。然后数组
文件名
将转换为指向其第一个元素的
字符*

此外:

  • 1元素绝对太短,无法读取字符串。通过指定元素数量分配更多元素,如
    char File_name[512]=“”
  • '.txt'
    是一个多字符常量。它的价值是实现定义的,而不是您想要的。您应该使用
    strstrstr(文件名“.txt”)
    而不是
    strhr(文件名“.txt”)
    。(
    strstr
    用于搜索字符串(包括中间字符串),不用于检查后缀,但其性能优于
    strhr()

旁白:
char文件名[]=”不够大,无法输入任何内容。它是一个长度为
1
的数组,只能容纳nul字符串终止符。编译器说
scanf(“%s”,&File\u name)应该是
scanf(“%s”,文件名)传递给函数的数组衰减为指针,因此不需要间接寻址。但我有空字符,用户写入文件名,程序应该以某种方式将保存的文件名放入字符中。或者你有其他想法。编译器说“boohoo这行代码不好:
scanf(“%s”和&File_name);
具体来说,错误就在这里
”。2.专注地盯着那条线。它真的会像编译器说的那样糟糕吗?3.实际上,您不需要理解编译器错误意味着什么,就可以找到另一个
&
错误。有一个箭头为您指出了这个bug,它能有多明显?
&File\u name
=>
File\u name
FILE *fd;
char File_name[]="";
<...>
printf("Enter the name of the file where you want the results to be saved. \n");
    printf("DON'T FORGET that file must end with .exe \n");
    scanf("%s",&File_name);
    while(strchr(File_name,'.txt')==NULL)
    {
        printf("The end of the file name is not correct. Please try again. \n");
        printf("File name: ");
        scanf("%s",&File_name);
    }