2015-12-11 1 views
1

J'essaie actuellement de faire mon propre shell, et il doit être polyglotte. J'ai donc essayé d'implémenter une fonction qui lit les lignes dans un fichier .txt.Erreur: le format '% s' attend l'argument de type 'char *', mais l'argument 2 a le type 'int' [-Wformat =]

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

Je suis sur win7 mais je compile avec gcc sur une machine virtuelle.

J'ai un avertissement en disant:

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

J'ai essayé d'exécuter le prog avec% d au lieu de% s et imprime des chiffres.

Je ne comprends pas ce qui convertit mon aMsg en int.

Mon fichier try.txt est juste:

Hi 
Quit 
+1

'printf ("% s \ n% s \ n", amsg [HI], amsg [QUITTER])' - -> 'printf ("% s \ n% s \ n ", & aMsg [HI], & aMsg [QUIT])' BTW Je ne sais pas si cette instruction fait ce que vous voulez. – LPs

+1

'printf ("% s \ n% s \ n ", aMsg [HI], aMsg [QUIT]);' n'a pas l'air correct. Peut-être que vous voulez 'printf ("% s \ n% s \ n ", & aMsg [HI], & aMsg [QUIT]);'? Et ne libérez pas (ligne), car vous ne l'avez pas «mallocé». –

+0

@Cool Guy Maintenant, il imprime moi HQ et Q ... mais pas d'erreur de compilation;) –

Répondre

1

Je suis tout à fait deviner, mais je pense que ce que vous voulez est:

#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

Merci beaucoup mec;) Cela fonctionne maintenant :) –

4

Le contenu de votre fichier texte n'a rien à voir avec l'avertissement, qui est généré par le compilateur avant que votre programme fonctionne jamais. Il se plaint de cette déclaration:

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

Variable globale aMsg est un tableau de char, si aMsg[HI] désigne un char. Dans ce contexte, sa valeur est promue à int avant d'être passée à printf(). Le descripteur de champ %s attend cependant un argument de type char *, et GCC est assez intelligent pour reconnaître que ce que vous transmettez est incompatible.

Peut-être que vous avez eu à l'esprit

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

ou même l'équivalent

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

mais si ceux-ci sont valables, je pense qu'ils ne produisent pas le résultat que vous voulez réellement. En particulier, compte tenu des données d'entrée que vous avez spécifié et le reste de votre programme, je pense que la sortie soit

HQ 
Q 

Si vous voulez lire et Retransmet tout le contenu du fichier d'entrée, vous avez besoin d'un approche tout à fait différente pour lire et écrire les données.

2

Jetons un coup d'oeil de plus près sur la ligne problématique:

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

La chaîne que vous souhaitez imprimer 2 paramètres attend chaîne. Vous avez aMsg [HI] et aMsg [QUIT]. Ces deux pointent vers un char, donc le résultat est un caractère pour chacun. Toutes les variables char peuvent être interprétées comme un caractère ou comme un nombre - le numéro d'identification du personnage. Donc je suppose que le compilateur les résout en tant que types int, vous fournissant ainsi ce message d'erreur.
En guise d'une solution, vous utilisez simplement% c au lieu de% s. Cependant, je soupçonne que vous voulez réaliser quelque chose d'autre.

+0

Oui, je veux imprimer le texte dans mon fichier .txt –

+1

Détail: comme un 'char' est passé à une fonction avec' ... ', ces paramètres passent par les promotions habituelles.Cela convertit' char' en 'int' – chux