导致程序崩溃的结构

时间:2016-04-21 05:10:44

标签: c file-io structure readfile file-pointer

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个标识符并且它已经运行,但是它打印的随机内容甚至不是文件中的内容。有什么想法吗?

[从comment更新:]

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

4 个答案:

答案 0 :(得分:2)

看看结构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可以将值存储在该地址指向的内存位置。

希望有所帮助。

答案 1 :(得分:1)

中的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);

答案 2 :(得分:1)

首先,您不应在结构中使用char name[]。因为数组在使用之前应该清除它的内存大小。

因此,您可以将char name[]更改为:

  1. char *name:你必须为它分配一个内存大小。检查下面的代码。
  2. char name[NAME_SIZE]
  3. 第二,如果你想更改另一个函数中的值,你应该通过它的&#39;内存地址。例如:

    示例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;
    }
    

答案 3 :(得分:0)

它可以是char *类型,您可能没有为它分配空间。它肯定会崩溃