0
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

4 に答える 4

2

構造体 sign_in がどのように見えるかを見ることは本当に役に立ちます。しかし、コードをざっと見てみると、明らかなエラーの 1 つは、パスワードのスキャン方法にあります。

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

この行は次のようになります。

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

変数 items[i].password のアドレスを渡す必要があるため、fscanf はそのアドレスが指すメモリ位置に値を格納できます。

それが役立つことを願っています。

于 2016-04-21T05:30:03.920 に答える
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);
于 2016-04-21T06:16:50.710 に答える
1

まず、構造では使用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;
}
于 2016-04-21T06:42:25.500 に答える
0

タイプは char * である可能性があり、そのためのスペースを割り当てていない可能性があります。そしたら確実に潰れる

于 2016-04-21T05:36:55.773 に答える