Структура, вызывающая сбой программы
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[]
чтобы:
char *name
: Вы должны выделить для нее объем памяти. проверьте мой код ниже.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 *, и у вас может не быть места для него. Это тогда обязательно потерпит крах