1

Тема: аналоги для gets()

доброго вечора, виникло ось таке питання по задачі: потрібно зробити структуру з днем тижня, планом робіт і зароблених грошей за день.

#include <stdio.h>
#include <stdlib.h>
#define dayWeek 2

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct resultWork 
{
    int day;
    char *plane;
    float actOut;
};


int main() 
{
    struct resultWork Week[6];
    for (int j = 0; j < dayWeek; j++)
    {
        Week[j].day = j;
        printf("day %d: \n plane:", j);
        
        gets(Week[j].plane);
        
        printf(" actual output: ");
        scanf("%f", &Week[j].actOut);
        printf("----------next day-----------\n");
    }
    
    /*printf("day\tplane \t\t\t actual output");
    for (i = 0; i < dayWeek; i++)
    {
        printf("");
    }*/
    
    return 0;
}

написав ось такого кота, та gcc в лінуксі видає помилку про небажане використання gets(), пробував замінити на fgets(Week[j].plane, 256, stdin);, але після вводу тексту зразу викидує segmentation fallout. В visual studio те саме, тобто, візуал навіть не знає функції gets. Спробував dev c++ з gcc 4.9.2, все добре, тільки при вводі 2-го і всіх наступних днів, масив plane вже ніби заповнений, здається тому що там вже є \0.
https://pp.vk.me/c604425/v604425937/3c333/MYE9F5B_rBk.jpg
Може хтось знає як вирішити?

2

Re: аналоги для gets()

char * - це вказівник на щось. C не виділяє пам'ять автоматично, це має робити програміст.

3

Re: аналоги для gets()

koala написав:

char * - це вказівник на щось. C не виділяє пам'ять автоматично, це має робити програміст.

Я робив ще по-іншому: char plane[256];, але нічого не змінилось

4

Re: аналоги для gets()

Після scanf у буфері введення лишається символ нового рядка '\n', перед gets треба якось його звідти витягнути.

5

Re: аналоги для gets()

koala написав:

Після scanf у буфері введення лишається символ нового рядка '\n', перед gets треба якось його звідти витягнути.

не підкажете як?

6

Re: аналоги для gets()

Культурніше циклом по символу getchar, доки не витягнете символ нового рядка, або gets у непотрібний буфер, це в коді красивіше виглядає.
Тут сенс у тому, що scanf і gets - ідеологічно різні способи читання, і при змішуванні потребують ось таких костилів. Альтернативою були б зайві дії без потреби, а C цього намагається уникати.

7 Востаннє редагувалося navchalkin (07.12.2016 00:09:08)

Re: аналоги для gets()

для чого його звідти витягувати, якщо можна просто не заносити? ))

#include <stdio.h>
#include <stdlib.h>
#define dayWeek 7

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct resultWork 
{
    int day;
    char plane[256];
    //char *plane;
    char actOut;
};


int main() 
{
    struct resultWork Week[6];
    int i=0;
    for (i = 0; i < dayWeek; i++)
    {
        Week[i].day = i;
        printf("day %d: \n plane:", i);
        char buf;
        int x = 0;
        buf = getchar();
        while (buf != '\n')
        {
            Week[i].plane[x++] = buf;
            buf = getchar();
        }
        
        printf(" actual output: ");
        buf = "";
        buf = getchar();
        while(buf != '\n')
        {
            Week[i].actOut = buf;
            buf = getchar();
        }
        printf("----------next day-----------\n");
    }
    /*printf("day\tplane \t\t\t actual output");
    for (i = 0; i < dayWeek; i++)
    {
        printf("");
    }*/
    
    return 0;
}
Подякували: TakeAction1

8

Re: аналоги для gets()

    struct resultWork Week[dayWeek];//чомусь же проголошували макро
    for (int j = 0; j < dayWeek; j++)//тим більше що у вас тут був би вихід за межі - в масиві 6 елементів, а цикл до 7
    {
        Week[j].day = j;
        printf("day %d: \n plane:", j);
        
        gets(Week[j].plane);
        
        printf(" actual output: ");
        scanf("%f", &Week[j].actOut);
        while(getchar()!='\n');//"з'їдаємо" до кінця рядка
        printf("----------next day-----------\n");
    }
Подякували: TakeAction1

9

Re: аналоги для gets()

navchalkin, koala, ну дууже дякую :)