【问题标题】:C - passing argument 1 of ‘fprintf’ makes pointer from integer without a castC - 传递'fprintf'的参数1使指针从整数而不进行强制转换
【发布时间】:2016-01-20 11:58:57
【问题描述】:

非常简单的脚本抛出这个错误:

传递“fprintf”的参数 1 使指针从不带 演员表

这是为什么呢?代码是:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
FILE *FP;

if((FP = fopen("file.txt", "r+")) == NULL) {
    printf("File won't open\n");
    return(1);
}

foo(FP);

return(0);
}

int foo(FP) {

    char name[31];
    printf( "Please enter a name (within 30 char) : \n");
    gets(name);
    fprintf(FP, "%s\n", name);

    return(0);
}

【问题讨论】:

  • 哦,你在哪里看到gets()?绝对是旧资源。不要使用gets() 使用fgets()FP 是什么?这不是脚本,而是程序。这是不一样的。脚本是使用解释器运行的程序,没有c 解释器。
  • FP 应该是 FILE * 类型。显示完整代码。
  • 我喜欢这些忽略了重要部分的问题。 FP 是什么?它在哪里声明和定义?
  • 直到您发布cat yourfile.c 结果的屏幕截图,然后紧跟gcc -Wall yourfile.c,我才相信这不会编译。 yourfile.c 应该是正是您发布的代码。
  • 看看HERE。发布的代码编译...

标签: c printf


【解决方案1】:

改变

int foo(FP) {

int foo(FILE * FP) { 

您必须在代码顶部放置foo 函数的原型。

【讨论】:

  • @lapin 您不必...并且 LP 已做出正确的附加说明,即应在使用前声明 foo()。您要么在某处写一行声明它(可能在文件顶部或标题中);或者你将整个函数定义——也是一个声明——移动到文件的顶部。
  • 好的,如果你允许我的话,那么公平地说,我把它改成了 LP :)
【解决方案2】:

默认情况下,C 中的函数 arg 具有 int 类型。因此,当您定义函数时,签名实际上是

int foo(int FP).

你应该把它改成

int foo(FILE *FP)

当然,最好在调用函数之前声明它。

【讨论】:

  • 感谢您通俗易懂的回答!
【解决方案3】:

foo(FP) 声明中的参数 FP 没有类型,因此默认为 int。因为foo 在调用fprintf 时将其用作第一个参数,所以int 被转换为合法但不推荐使用的FILE 指针。

修复:只需将 foo 声明为 int foo(FILE *FP){...}

编辑:是的,正如 LP 所说,您应该在使用之前声明该函数,特别是如果您向或从它传递或返回除 int 之外的其他类型。声明可以与定义分开,可能在标题中;或者您只需将函数定义(也是一个声明)移动到第一次使用之前的位置。

【讨论】:

    【解决方案4】:

    您忘记了 Foo 函数中 FP 参数中的类型分类器。令人惊讶的是,您没有收到有关它的警告。 在编译时,请打开-Wall-pedantic 标志(如果您在gcc)。或至少 -Wimplicit-int 警告标志以避免类似问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      相关资源
      最近更新 更多