Error : format'%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]

后端 未结 3 1059
半阙折子戏
半阙折子戏 2021-01-24 10:17

I am currently trying to do my own shell, and it has to be polyglot. So I tryed to implement a function that reads the lines in a .txt file.

#include 

        
相关标签:
3条回答
  • 2021-01-24 10:58

    The contents of your text file have nothing to do with the warning, which is generated by the compiler before your program ever runs. It is complaining about this statement:

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

    Global variable aMsg is an array of char, so aMsg[HI] designates a single char. In this context its value is promoted to int before being passed to printf(). The %s field descriptor expects an argument of type char *, however, and GCC is smart enough to recognize that what you are passing is incompatible.

    Perhaps you had in mind

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

    or the even the equivalent

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

    but though those are valid, I suspect they won't produce the result you actually want. In particular, given the input data you specified and the rest of your program, I would expect the output to be

    HQ
    Q
    

    If you wanted to read in and echo back the whole contents of the input file then you need an altogether different approach to both reading in and writing out the data.

    0 讨论(0)
  • 2021-01-24 10:59

    I'm completely guessing, but I think what you want is:

    #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;
    }
    
    0 讨论(0)
  • 2021-01-24 11:16

    Let's take a closer look on the problematic line:

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

    The string you would like to print expects 2 string parameters. You have aMsg[HI] and aMsg[QUIT]. These two are pointing to a char, so the result is one character for each. All char variables can be interpreted as a character or as a number - the character's ID number. So I assume the compiler resolves these as int types, thus providing you that error message.
    As one solution you merely use %c instead of %s.

    However, I suspect you want to achieve something else.

    0 讨论(0)
提交回复
热议问题