Проблема чтения в строке в C для ввода динамических чисел - PullRequest
0 голосов
/ 05 марта 2019

Я нуб, борюсь с C. Мне трудно оборачивать голову указателями, стрелками -> и точечными . обозначениями.Я работаю над очень простой программой, которая имеет 1 структуру, но я не уверен, как заставить пользователей вводить строки без использования заголовка <cs50.h> (что мне нужно понять для более сложной проблемы, я также пытаюсь обернуть головувокруг).

//#include <cs50.h>
#include <stdio.h>
#include <string.h>

// create a struct, call it pupils
typedef struct
{
    char *name;
    char *dorm;
}
pupils;

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        // Not the way to do this given various error codes.....

        char idinfo[i].Name[20];
        char Dorm[20];
        // gets idinfo[i].Name
        scanf("%s", idinfo[i].Name);
        //idinfo[i].name = printf("%s", Name);

        // Below syntax works fine when <string.h> header included
        idinfo[i].dorm = get_string("Dorm: ");
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
}

Ответы [ 3 ]

3 голосов
/ 05 марта 2019

Предполагая, что вы не хотите использовать магию cs50, вам придется распределять и освобождать строки. Из вашего кода я также предполагаю, что входные строки должны быть короче 20 символов. Следующий код даже не гарантирует, что это правда, но также не завершится сбоем, а просто даст неожиданные результаты.

Код может быть:

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        // allocate memory for idinfo[i] pointers:
        idinfo[i].name = malloc(20);
        scanf("%19s", idinfo[i].name);
        idinfo[i].dorm = malloc(20);
        scanf("%19s", idinfo[i].dorm);
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
    // free allocated memory
    for (int i = 0; i < enrollment; i++)
    {
        free(idinfo[i].name);
        free(idinfo[i].dorm);
    }
}
1 голос
/ 05 марта 2019

Вы, вероятно, хотите что-то вроде этого:

#include <cs50.h>    // needed for get_xxx functions and other cs50 stuff
...
// Prompt for students' names and dorms
for (int i = 0; i < enrollment; i++)
{
   idinfo[i].name = get_string("Name: ");
   idinfo[i].dorm = get_string("Dorm: ");
}

Но это должно быть отражено в документации, которую вы дали.

Мой совет не использовать scanf вообще, а использовать толькометоды ввода cs50 get_xxx.

И будьте осторожны: cs50 string - это не настоящий "строковый" тип, а просто то же самое, что char *.

0 голосов
/ 05 марта 2019

Благодаря Сержу, я смог получить свой код, который компилируется ниже.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// create a struct, call it pupils
typedef struct
{
    char *name;
    char *dorm;
}
pupils;

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
    // allocate memory for idinfo[i] pointers:
        idinfo[i].name = malloc(20);
        idinfo[i].dorm = malloc(20);

        printf("Enter student %d's Name ", i+1); 
        scanf("%19s", idinfo[i].name);

        printf("Enter student %d's dorm ", i+1);
        scanf("%19s", idinfo[i].dorm);
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
    // free allocated memory
    for (int i = 0; i < enrollment; i++)
    {
        free(idinfo[i].name);
        free(idinfo[i].dorm);
    }
}
...