2016-04-21 130 views
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標識符,並且它運行了,但是它打印的是隨機的東西,甚至沒有接近文件中的內容。有任何想法嗎?結構導致程序崩潰


[更新從comment:]

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

'fscanf(Fpointin,「%s%d」,items [i] .name,items [i] .password);''''''''''''''''''''我猜測密碼是一個字符串。如果是這樣,你需要使用'「%s%s」'作爲格式字符串。 –

+7

發佈'struct sign_in'定義 – red0ct

+0

如何在評論部分發布代碼? – JMBTaylor

回答

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; 
} 
2

這將是看結構sign_in樣子真的很有幫助。但是,從代碼的快速查看,一個明顯的錯誤是密碼被掃描的方式。

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

該線路應該是:

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

需要在可變項的地址通過[I]。密碼,使得的fscanf可以存儲由該地址指向的存儲器位置的值。

希望有所幫助。

0

它可以是char *類型,而你可能沒有爲它分配空間。然後,它肯定會崩潰

+0

我不認爲我曾經使用過類型char *。請解釋? – JMBTaylor

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); 
+0

工程太棒了!謝謝! – JMBTaylor