【问题标题】:"Pointer from integer without cast" warning when opening file.打开文件时出现“无强制转换的整数指针”警告。
【发布时间】:2014-02-27 22:54:33
【问题描述】:

我在 C 语言中有这个作业要做。我是初学者,所以它可能很容易,但无论如何我都有问题。

int main(int argc, char* argv){

    int fd=open(argv[1], O_RDONLY);
    int fileLength=(int)lseek(fd,0,SEEK_END);
    lseek(fd,0,SEEK_SET);
    char buf[fileLength];
    read(fd,buf,fileLength);
    int i=0;
    for(i=0; i<fileLength; i++){
        printf("%c",buf[i]);
    }
    printf("\n");
}

我收到此错误:

警告:传递“open”的参数 1 使指针从整数而不进行强制转换

如果我写"file" 而不是argv[1],一切都好。

【问题讨论】:

  • 你是如何运行程序的?您应该执行类似./program filename 的操作,其中文件名是您要打开的文件。
  • int main(int argc, char **argv){ ...}
  • int main(int argc, char* argv) 更改为int main(int argc, char* argv[])
  • 与您的问题无关,但使用int 作为文件长度并转换lseek 的返回类型是错误的。正确的类型是off_t

标签: c file argv


【解决方案1】:
int main(int argc, char* argv){

必须是:

int main(int argc, char *argv[])

看到错误了吗?

【讨论】:

    【解决方案2】:

    char* argv 应该是char* argv[]

    您所做的是将 argv 声明为 char*,然后 argv[1] 变为 char(整数)而不是 char *

    【讨论】:

      【解决方案3】:

      正确的签名是

      int main(int argc, char **argv)
      

      【讨论】:

        【解决方案4】:

        您的问题出在main() 声明中,应该是:

        int main(int argc, char *argv[])
        

        您将argv 定义为char *,这使其成为单个指针,而它是char * 指针的数组,每个char * 元素对应于程序的命令行参数。

        您遇到的错误是由于当您将argv[1] 传递给open() 时,argv[1] 是单个char,而open() 需要char *

        您的程序的另一个改进是在尝试使用argv[1] 之前检查argc &gt; 1。当您没有向程序传递任何参数时,这将捕获情况。

        【讨论】:

          【解决方案5】:

          argv 应该是 char ** 而不是 char * 你也应该像这样运行程序

          ./program filename

          【讨论】:

            【解决方案6】:

            您的main 函数签名错误。

            应该是这样的:

            int main(int argc, const char *argv[]) // notice how 'argv' is now a 'const char *[]',
            

            【讨论】:

              【解决方案7】:

              试试这个伙伴:

              main () {
                  FILE *fin  = fopen ("test.in", "r");
                  FILE *fout = fopen ("test.out", "w");
                  int a, b;
                  fscanf (fin, "%d %d", &a, &b);  /* two input integers */
                  fprintf (fout, "%d\n", a+b);
                  exit (0);
              }
              

              而不是“test.in”提出你的论点,你之前尝试过吗?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-19
                • 1970-01-01
                • 2016-06-21
                • 2011-07-04
                相关资源
                最近更新 更多