LINUX.ORG.RU

Я считываю из файла строку символов в другую строку находящуюся в массиве структур fscanf-ом. Почему ошибка в формате?

 , , ,


0

1

Sklad4.c:299:13: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char (*)[15]» [-Wformat] Sklad4.c:304:13: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char (*)[9]» [-Wformat]

#include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAX 100
# define NAME 15
# define NAMEOFFILE file.myfilE

struct addsklad {
    char name[NAME];
    float price;
    char date[9];
    int postupilo;
    int lost;
} adds_list[MAX];

int How_much_product_inthis_day_you_have(){
    int hehe=0,hey=1,i2=0;
    int wou=0,wwa=0;
    int k=0,rr=0,zed=0;
    int dd=0,mm=0,yy=0;
    char V[4];
    int a=0;
    char d[4];
    char l[4];
    char w[MAX],ert[MAX];
    int l1=0;
    char p[MAX],i[MAX];
    int D[MAX],l2=0;
    int k2=0,t=0,n=0;
    char y[MAX],yut[MAX],add1[MAX];
    //тут была считака и проверка даты
    printf("The date is:");    
    FILE *f;
    hehe=2;
    if(hehe!=1){
         sprintf(ert, "%d.%d.%d", dd,mm,yy);
         printf("%s\n",ert);

         if((f=fopen("NAMEOFFILE","a"))==NULL){
        printf("File can't open\n");
        }
    rewind(f);
    fclose(f);
    f=fopen("NAMEOFFILE","r");
    a=0;

    init_list();
    while(!(feof(f)))
    i2=0;
            fscanf(f,"%d",&i2);
            printf("%d",i2);
            fscanf(f,"%s",&adds_list[i2].name);

            fscanf(f,"%f",&adds_list[i2].price);
            fscanf(f,"%d",&adds_list[i2].lost);
            fscanf(f,"%d",&adds_list[i2].postupilo);
            fscanf(f,"%s",&adds_list[i2].date);


            //if (adds_list[i2].date == ert) {
                    printf("\n%s\n%f\n%d\n%d\n", adds_list[i2].name, adds_list[i2].price, adds_list[i2].lost, adds_list[i2].postupilo);
          //}
          //else{
              //printf("In file there is no date like this((\n");
             // break;

           // }

           i2++;
 fclose(f);


    }

    else printf("Sorry, you enter sm-thing wrong\n");


}



Это часть кода тк по правилом вставлять только ту часть в которой ошибка



Последнее исправление: WhiteLedy (всего исправлений: 10)

Ответ на: комментарий от WhiteLedy

А слабо код обернуть в специально существующий для этого тег, чтобы сохранить форматирование? Впрочем, даже после обработки indent'ом код выглядит как говно.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от WhiteLedy

Неа, не изменил)

Вот как ты думаешь, постороннему человеку можно что понять в твоем полотне?

И вообще, char - это 1 (прописью: один) символ, а char[15] - массив из 15 (прописью: пятнадцати) символов. Разница есть, как видишь.

В общем, попытайся сформулировать так, чтобы тебя поняли. Покажи, в какой строчке ошибка и что за переменные ты там используешь.

onanij
()
Ответ на: комментарий от WhiteLedy

ничегонепонятно.

Ну ничего, у нас впереди ещё много времени. Советую поступить в соответствии с написаным сдесь: http://segfault.kiev.ua/smart-questions-ru.html

Ещё раз: приведи хотя бы участок кода (но не весь код!), где у тебя ошибка

onanij
()
Ответ на: комментарий от Deleted

Человек просто не умеет вопросы задавать, а ты со своим лолкоде

onanij
()
Ответ на: комментарий от WhiteLedy

Вот что я написал:

Ещё раз: приведи хотя бы участок кода (но не весь код!), где у тебя ошибка

Попробуй сузить как-то. Тебе компилятор даже строчку подсказывает, где предупреждение. Или ты думаешь, что тут будут люди сидеть и выщитывать ~300-ую строку для тебя?

onanij
()
Ответ на: комментарий от onanij

Я уже сделал меньше ну лан сейчас ещё уменьшу

WhiteLedy
() автор топика

but argument 3 has type «char (*)[15]»

это тип «указатель на массив», а ожидается указатель на char

AptGet ★★★
()
Ответ на: комментарий от AptGet

У меня char (*)[15] просто fscanf(f,«%s»,&adds_list[i2].name); Как это изменить? Как указать на char? Есть способ кроме как считать не в структуру напрямую?

WhiteLedy
() автор топика
Ответ на: комментарий от WhiteLedy

У меня char (*)[15] просто fscanf(f,«%s»,&adds_list[i2].name); Как это изменить? Как указать на char? Есть способ кроме как считать не в структуру напрямую?

убрать «&», тип «массив a» конвертируется в тип «указатель на a» почти во всех выражениях автоматически

fscanf тут небезопасен, с такой форматной строкой

AptGet ★★★
()

Теперь понятно, пасибо)

WhiteLedy
() автор топика

Какой странный ник, учитывая что гендерная карта не разыгрывалась.

anonymous
()

Почему ошибка в формате?

Ledy

Дальше не читал

buddhist ★★★★★
()

Я думал нет ничего страшнение буферов на маллоках, но это просто потрясло моё воображение. Это месение памяти - беда всеямасштаба.

Мне лень осиливать это портянку, ибо моё лицо не выдержит 2.5фейспалма в секунду при чтении и вкуривании, но всё же, если это какой-то парсер - я открою тебе тайну: Ты копируешь файл в буффер и все строки ты можешь юзать из этого буфера, заменя разделители на нул, а начало искомой подстроки ты записываешь в указатель.

Так работает strtok(), а твоя же портянка - это ужос.

Осиль разделитель типа пробела, или ';' и осиль strtok()( либо strchr(), если хочешь реактивности) и перепиши портянку по человечески.

int hehe=0,hey=1,i2=0;
    int wou=0,wwa=0;
    int k=0,rr=0,zed=0;
    int dd=0,mm=0,yy=0;
    char V[4];
    int a=0;
    char d[4];
    char l[4];
    char w[MAX],ert[MAX];
    int l1=0;
    char p[MAX],i[MAX];
    int D[MAX],l2=0;
    int k2=0,t=0,n=0;
    char y[MAX],yut[MAX],add1[MAX];

Просто радует глаз, стиль борадачей-неосиляторов, передающийся из поколения в поколение. Как это решить - я тебе написал выше.

Выкинь трансилитик.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

блаблабла

    char V[4];
    char d[4];
    char l[4];
    char p[MAX],i[MAX];
    char w[MAX],ert[MAX];
    char y[MAX],yut[MAX],add1[MAX];
    int D[MAX],l2=0;
    int a=0;
    int dd=0,mm=0,yy=0;
    int hehe=0,hey=1,i2=0;
    int k2=0,t=0,n=0;
    int k=0,rr=0,zed=0;
    int l1=0;
    int wou=0,wwa=0;
bhfq ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.