c - 错误 : format'%s' expects argument of type 'char *' , 但参数 2 的类型为 'int' [-Wformat=]

标签 c gcc gcc-warning

我目前正在尝试做我自己的 shell,它必须是多语言的。 所以我尝试实现一个函数来读取 .txt 文件中的行。

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


// globals
char lang[16] = {'t','r','y'};
char aMsg[512];

// functions
void takeFile() {
    int i =0;
    char namFil[32];
    char lg[16];
    FILE * file;
    char tmp[255];
    char * line = tmp;
    size_t len = 0;
    ssize_t read;


    strcpy(namFil,"/media/sf_Projet_C/");
    strcpy(lg,lang);
    strcat(lg, ".txt");
    strcat(namFil, lg);
    file = fopen(namFil, "r");
    printf("%s\n", namFil);

    while((read = getline(&line,&len, file)) != -1) {
        aMsg[i] = *line;
    i++;
    }
}

enum nMsg {HI, QUIT};

int main(void) {
    takeFile();
    printf("%s\n%s\n", aMsg[HI], aMsg[QUIT]);
}

我在 win7 上,但我在 VM 上使用 gcc 进行编译。

我有一个警告说:

format'%s' expects argument of type 'char *', but argument 2 (and 3) has type 'int' [-Wformat=]

我试图用 %d 而不是 %s 来执行程序,它打印出数字。

我不明白是什么将我的 aMsg 转换为 int。

我的 try.txt 文件是:

Hi
Quit

最佳答案

您的文本文件的内容与警告无关,该警告是在您的程序运行之前由编译器生成的。它提示这个声明:

printf("%s\n%s\n", aMsg[HI], aMsg[QUIT]);

全局变量aMsg 是一个char 数组,因此aMsg[HI] 指定一个char。在此上下文中,它的值在传递给 printf() 之前被提升为 int%s 字段描述符需要一个 char * 类型的参数,但是,GCC 足够聪明,可以识别您传递的内容是不兼容的。

也许你已经想到了

printf("%s\n%s\n", &aMsg[HI], &aMsg[QUIT]);

或者甚至是等价物

printf("%s\n%s\n", aMsg + HI, aMsg + QUIT);

但尽管这些都是有效的,但我怀疑它们不会产生您真正想要的结果。特别是,给定您指定的输入数据和程序的其余部分,我希望输出为

HQ
Q

如果您想读入并回显输入文件的全部内容,那么您需要一种完全不同的方法来读入和写出数据。

关于c - 错误 : format'%s' expects argument of type 'char *' , 但参数 2 的类型为 'int' [-Wformat=],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227373/

相关文章:

c - 如何测试字符串是否遵循 C 中的给定模式?

c - 在 c 中选择显示奇怪的行为

c++ - 这是一个clang错误还是我不了解C++的东西?

c - 缺少 'uninitialized' 警告

c++ - GCC 关于 strncpy 使用的误报警告?

c++ - 如何从 Eclipse 中删除 C/C++ 并完成 CDT?

c - 欧拉项目 - 问题 22 : Answer off by 3. 35%

c++ - 用于调试信息文件的 DWARF diff 工具

Ruby 1.8.6 `gem install` 段错误与 "abort trap 6"

c++ - 如何使 "whose type uses the anonymous namespace [-Werror]"gcc 版本 4.8.2 静音