Структура, вызывающая сбой программы

int get_name()
{
    char cName[] = "hello";
    int iCode, i = 0;
    struct sign_in items[6];//array of six structure variables

    Fpointin =fopen("namepass.txt","r");

    if (Fpointin == NULL)
    {
        printf ("File does not exist.\n");
    }
    else
    {
        for (i=0;i<6;i++)
        {
            fscanf(Fpointin,"%s %d",items[i].name,items[i].password);//read all values from the file into th structure
        }
        printf("Here is the sign_in structure\n");//print the entirety of the sign_in structure
        for (i=0;i<6;i++)
        {
            printf("name: %s\ncode: %d\n\n", items[i].name, items[i].password);
        }
    }
    fclose(Fpointin);
}

Всем привет. Итак, я получил этот фрагмент кода из проекта, и он вылетает всякий раз, когда я пытаюсь его запустить. Я пытаюсь прочитать имена и соответствующие им коды доступа из файла в структуру, и она не работает. в fscanf линия у меня была %s %d Идентификаторы поменялись местами, и он запустился, но он напечатал случайные вещи, которые даже близко не были в файле. Есть идеи?


[обновление от комментария:]

struct sign_in
{ 
  int password; //The password for each player 
  char name[]; //Name of the people who can sign in
}

4 ответа

Решение

Во-первых, вы не должны использовать char name[] в вашей структуре. Потому что массив должен объявить свой объем памяти, прежде чем использовать его.

Итак, вы можете изменить char name[] чтобы:

  1. char *name: Вы должны выделить для нее объем памяти. проверьте мой код ниже.
  2. char name[NAME_SIZE]

Во-вторых, если вы хотите изменить значение внутри другой функции, вы должны передать ей адрес ее памяти. например:

Пример 1: если вы просто передаете значение, но не адрес

void foo(int in)
{
    in = 5;
}

int main(int argc, char const *argv[])
{
    /* code */
    int a = 10;
    foo(a);
    printf("after foo, a: %d\n", a);
    return 0;
}

выход:after foo, a: 10

Пример 2: если вы передаете адрес памяти.

void foo(int *in)
{
    *in = 5;
}

int main(int argc, char const *argv[])
{
    /* code */
    int a = 10;
    foo(&a);
    printf("after foo, a: %d\n", a);
    return 0;
}

выход:after foo, a: 5

Итак, вы должны пройти items[i].passwordадрес памяти в fscanf вроде:
fscanf(Fpointin,"%s %d",items[i].name, &items[i].password);

Следовательно, ваш код должен выглядеть так:

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

struct sign_in {
    int password;//The password for each player
    char *name;//Name of the people who can sign in
};

void init_myStruct(struct sign_in *s_in) {
    s_in->name = calloc(1, sizeof(char)*1024);
    return;
}

void destroy_myStruct (struct sign_in *s_in) {
    free(s_in->name);
    s_in->name = NULL;
    return;
}

int get_name()
{
    int i = 0;
    FILE *Fpointin = NULL;
    struct sign_in items[6];//array of six structure variables

    for ( i = 0; i < 6; i++)
        init_myStruct(&items[i]);

    Fpointin =fopen("namepass.txt","r");
    if (Fpointin == NULL) {
        printf ("File does not exist.\n");
        goto end_of_use;
    }
    else
    {
        printf("Here is the sign_in structure\n");//print the entirety of the sign_in structure
        for ( i = 0; i < 6; i++) {
            fscanf(Fpointin,"%s %d",items[i].name, &items[i].password);//read all values from the file into th structure
            printf("name: %s\ncode: %d\n\n", items[i].name, items[i].password);
        }
    }
    fclose(Fpointin);

end_of_use:
    for ( i = 0; i < 6; i++)
        destroy_myStruct(&items[i]);
    return;
}

int main(int argc, char const *argv[])
{
    get_name();
    return 0;
}

Было бы очень полезно увидеть, как выглядит структура sign_in. Но при быстром взгляде на код очевидной ошибкой является способ сканирования пароля.

fscanf(Fpointin,"%s %d",items[i].name,items[i].password);

Эта строка должна быть:

fscanf(Fpointin,"%s %d",items[i].name, &items[i].password);

Вам нужно передать адрес переменной items[i].password, чтобы fscanf мог сохранить значение в ячейке памяти, указанной этим адресом.

Надеюсь, это поможет.

char name[]; в

struct sign_in
{
  ...
  char name[]; 

имеет неполный тип. Не выделяется память.

использование

#define NAME_LEN_MAX 42

...

struct sign_in
{
  ...
  char name[NAME_LEN_MAX + 1];

например и настроить сканирование следующим образом:

fscanf(Fpointin, "%42s %d", items[i].name, &items[i].password);

Он может иметь тип char *, и у вас может не быть места для него. Это тогда обязательно потерпит крах

Другие вопросы по тегам