从不兼容的指针类型传递'fopen'的参数1?

Bil*_*ina 0 c

我在这段代码中被困了一段时间:

#include <stdio.h>

const char *fn; int a;

int exists(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

main(){

    printf("Name:\n");
    scanf("%s",&fn);

    a=exists(&fn)

    if(a==0){
        fopen(&fn,"w");
        fprintf(fn,"banhdhsjha");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行该程序时,它一直工作fprintf(fn,"banhdhsjha");,但它在这里崩溃(Windows给我一个错误),编译器(CodeBlocks)给了我以下通知:

从不兼容的指针类型传递'fopen'的参数1.

我试图fprintf在文件中写入数据,但我不知道该怎么做.你能帮助我吗?

AnT*_*AnT 5

您的代码中存在很多问题.

  1. 要传递&fnscanf.这&fn是指向const char **类型指针的指针.这根本不符合逻辑.格式说明符%s需要const char *参数,而不是const char **.您基本上使用指针fn本身作为文件名的目标缓冲区(4或8个字节长,具体取决于您平台的指针大小).很可能你键入的文件名比"缓冲区"可以容纳的文件名长.这会覆盖程序中的内存并导致不可预测(未定义)的行为.
  2. 可能是正确的形式scanf("%s", fn),但问题是你从未为目标缓冲区分配内存.您必须确保fn指向char足够大小的缓冲区来保存文件名.
  3. fopen(&fn,"w")遇到了同样的问题(这就是编译器告诉你的).fopen期望一个const char *类型的参数,而你正在传递一个const char **.正确的形式是fopen(fn,"w"),但再次看到2.此外,fopen返回您应该存储并稍后使用的文件句柄.你忽略(丢弃)的返回值fopen.这也没有意义.您需要一个额外的FILE *变量来存储返回值fopen.你已经知道,从你在exists功能上做了什么来判断,但不知怎的,你忽略了你的知识main.
  4. 你的fprintf电话也毫无意义.fprintf需要文件句柄(FILE *类型)作为其第一个参数.相反,您试图传递一个文件名.这不会起作用,而且还会触发编译器的诊断消息.你应该存储fopen(如我在3中所述)的返回值并将其传递给fprintf.
  5. 您的exists(&fn)呼叫遇到与1和3相同的问题,并产生与您的fopen呼叫相同的诊断消息.

停止尝试编写随机代码.你在哪里有想法传递文件名fprintf而不是文件句柄?阅读您尝试使用的每个功能的文档并采取相应措施.