【问题标题】:Error : format'%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]错误:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“int”[-Wformat=]
【发布时间】:2015-12-11 15:46:16
【问题描述】:

我目前正在尝试做自己的 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 执行 prog,它会打印数字。

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

我的 try.txt 文件只是:

Hi
Quit

【问题讨论】:

  • printf("%s\n%s\n", aMsg[HI], aMsg[QUIT]) --> printf("%s\n%s\n", &amp;aMsg[HI], &amp;aMsg[QUIT]) BTW 我不知道这条指令是否符合你的要求。
  • printf("%s\n%s\n", aMsg[HI], aMsg[QUIT]); 看起来不对。也许你想要printf("%s\n%s\n", &amp;aMsg[HI], &amp;aMsg[QUIT]);?不要free(line);,因为你还没有malloced。
  • @Cool Guy 现在它会打印我的 HQ 和 Q...但没有编译错误 ;)
  • 我认为您误解了您的代码的作用。该 printf 打印从 index 0aMsg 数组开始的 NULL terminated string 和从 aMsg 数组的 index 1 开始的 NULL terminated string。可能您希望char *aMsg[512]; 根据指针数组更改您的代码。
  • 这篇文章没有提出任何问题。选择的答案提供了工作代码,没有解释。其他答案解释并提供了代码的工作 sn-ps。似乎需要“鱼”而不是 fishing lesson"。

标签: c gcc gcc-warning


【解决方案1】:

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

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

全局变量aMsgchar 的数组,所以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

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

【讨论】:

    【解决方案2】:

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

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

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

    但是,我怀疑你想要实现其他目标。

    【讨论】:

    • 是的,我想打印 .txt 文件中的文本
    • 详细信息:当char 被传递给带有... 的函数时,这些参数会经历通常的提升。这会将char 转换为int
    【解决方案3】:

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

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2012-10-04
      • 2016-09-14
      相关资源
      最近更新 更多