2015-12-11 4 views
1

В настоящее время я пытаюсь выполнить свою собственную оболочку, и она должна быть полиглотой. Итак, я попытался реализовать функцию, которая читает строки в TXT-файле.Ошибка: формат '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип '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]); 
} 

Я нахожусь на win7, но скомпилирую с gcc на виртуальной машине.

У меня есть предупреждение поговорка:

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

Я попытался выполнить прогу с% г вместо% с и печатают номера.

Я не понимаю, что превращает мой aMsg в int.

Мой файл try.txt просто:

Hi 
Quit 
+1

'Е ("% s \ п% s \ п", АМСГ [HI], АМСГ [ВЫЙТИ])' - -> 'printf ("% s \ n% s \ n ", & aMsg [HI], & aMsg [QUIT])' BTW Я не знаю, делает ли эта инструкция то, что вы хотите. – LPs

+1

'printf ("% s \ n% s \ n ", aMsg [HI], aMsg [QUIT]);' не выглядит правильным. Возможно, вы хотите 'printf («% s \ n% s \ n », & aMsg [HI], & aMsg [QUIT]);'? И не 'free (line);' поскольку вы не 'malloc'ed его. –

+0

@Cool Guy Теперь он печатает меня HQ и Q ... но ошибки компиляции;) –

ответ

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; 
} 
+0

Большое спасибо чувак;) Это работает сейчас :) –

4

Содержимое текстового файла не имеют ничего общего с предупреждением, которое генерируется компилятором, прежде чем ваша программа никогда не работает. Он жалуется на это заявление:

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

Глобальная переменная aMsg является массивом char, так 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 

Если вы хотите прочитать и эхо обратно все содержимое входного файла, то вам нужно совсем другой подход к чтению и записи данных.

2

Давайте повнимательнее посмотрим на проблемную линию:

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

Строка вы хотели бы напечатать ожидает 2 строки параметров. У вас есть aMsg [HI] и aMsg [QUIT]. Эти два указывают на char, поэтому результат - один символ для каждого. Все переменные char могут быть интерпретированы как символ или как число - идентификационный номер символа. Поэтому я предполагаю, что компилятор разрешает их как типы int, тем самым предоставляя вам это сообщение об ошибке.
В качестве одного из решений вы просто используете% c вместо% s.

Однако, я подозреваю, что вы хотите достичь чего-то еще.

+0

Да, я хочу, чтобы напечатать текст в моем текстовом файле –

+1

Detail:., Как a 'char' передается функции с' ... ', эти параметры проходят обычные рекламные акции. Это преобразует' char' в 'int'. – chux