错误:格式'%s'期望类型' char *'的参数,但参数2的类型为' int' [-Wformat =]

时间:2015-12-11 15:46:17

标签: 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

3 个答案:

答案 0 :(得分:4)

文本文件的内容与警告无关,警告是在程序运行之前由编译器生成的。它抱怨这句话:

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

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

也许你想到了

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

或甚至相当于

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

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

HQ
Q

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

答案 1 :(得分:2)

让我们仔细看看有问题的一行:

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

您要打印的字符串需要2个字符串参数。你有 aMsg [HI] aMsg [QUIT] 。这两个指向 char ,因此每个结果都是一个字符。所有char变量都可以解释为字符或数字 - 字符的ID号。所以我假设编译器将这些解析为int类型,从而为您提供该错误消息。
作为一种解决方案,您只需使用%c而不是%s。

但是,我怀疑你想要实现别的目标。

答案 2 :(得分:1)

我完全在猜测,但我认为你想要的是:

#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] = malloc(strlen(line)+1);
        strcpy(aMsg[i], line);
        i++;
    }

    fclose(file);
}

enum nMsg {HI, QUIT};

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

    free(aMsg[HI]);
    free(aMsg[QUIT]);

    return 0;
}