2014-02-14 108 views
0

輸入文件:指針值改變

JOHN 9999999999 
MEENA 9888888888 
RIA 8718218218 
SONIA 7777777777 
FINCH 1234567890 
  • 我想通過附加文件的內容到list.I創建一個前哨以「沒有價值」進入它創建一個循環鏈表。

  • 當我在gdb p-> next->名稱處測試我的代碼時,uploadAddresses()中的while循環結束時顯示了Finch.How是否可能?p值是否保持相同只有temp值在每個迭代。

    #include<stdio.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #define MAXPHONENO 100 
    
    //Variables declaration 
    struct Contact { 
        char *name; 
        char *mobileno; 
        struct Contact *next; 
    }; 
    typedef struct Contact Contact;  
    typedef Contact* PHBOOK; 
    
    //Function declaration 
    PHBOOK createAddressBook(); 
    PHBOOK uploadAddresses(PHBOOK pb,char *name); 
    
    //Implementation 
    PHBOOK createAddressBook(){  
        PHBOOK pb = (PHBOOK)malloc(sizeof(Contact)); 
        pb->name = "NO ENTRY";  
        pb->mobileno = "NO ENTRY";  
        pb->next = pb;  
        return pb;  
    } 
    
    
    PHBOOK uploadAddresses(PHBOOK p,char *fname){ 
        PHBOOK temp = p; 
        char mob[20],name[20]; 
        FILE *fp = fopen(fname,"r"); 
        while(fscanf(fp,"%s %s",name,mob)!=EOF){ 
        temp->next = (PHBOOK)malloc(sizeof(Contact));  
        temp = temp->next;  
        temp->name = name;  
        temp->mobileno = mob;  
        printf("%s %s\n",name,mob);  
        }  
        temp->next = p;  
        return p;  
    } 
    
    int main(){  
        PHBOOK pb = createAddressBook();  
        pb = uploadAddresses(pb,"/home/user/names_mobile");  
        return 0; 
    } 
    
+0

函數'createAddressBook'的代碼在哪裏? –

+0

我已經發布了createAddressBook()的代碼,現在 – user3310015

+0

如果你想要一個循環鏈表,爲什麼你只指向下一個項目,而不是前一個?另外,爲了定義列表的最後一個元素,指向下一個元素的指針被用來定義爲'null',而不是它本身。 – adripanico

回答

1
temp->name = name; 

你只分配指針temp->name

該指針指向一個局部變量。

編輯:

在你的情況炭名稱[20]所使用的的fscanf以包含輸入名稱,它的上下文中的每個循環改變。在while循環結束時它會是「Finch」。

因爲我們知道「temp-> name」指向包含「Finch」的「char name [20]」,這就是您看到它的原因。

+0

您可能想添加一個解釋,爲什麼將參考存儲到局部變量不是一個好主意。 – alk

+0

@alk肯定,謝謝 –

1

變化:

temp->name = name; 
temp->mobileno = mob;  

要:

temp->name = malloc(strlen(name)+1); 
temp->mobileno = malloc(strlen(mob)+1); 
strcpy(temp->name,name); 
strcpy(temp->mobileno,mob); 
+0

正確,您已將'name'和'mobileno'定義爲指向char的指針。奇怪的是你沒有收到一些分段錯誤。 – adripanico

0

malloc的一些記憶

char *name; 
char *mobileno; 

以及這將解決你的問題。

PHBOOK uploadAddresses(PHBOOK p,char *fname){ 

PHBOOK temp = p; 
char mob[20],name[20]; 

FILE *fp = fopen(fname,"r"); 


    while(fscanf(fp,"%s %s",name,mob)!=EOF) 
    { 
    temp->next = (PHBOOK)malloc(sizeof(Contact)); 
    temp = temp->next; 
    temp->name = (char*)malloc(sizeof(char) * MAX_NAME) ;  
    temp->mobileno = (char*)malloc(sizeof(char) * MAX_PHNO) ; 

    strcpy(temp->name,name); 
    strcpy(temp->mobileno,mob); 

    }  
    temp->next = p;  
    return p;  

}

+0

爲什麼不,最後一個元素與上面代碼中的第一個元素鏈接在一起... – 51k

0

改進代碼:

注<%毫秒>改性劑,其用於動態地串分配空間。還必須關閉文件,否則會發生資源泄漏。

PHBOOK uploadAddresses(PHBOOK p,char *fname){ 
     PHBOOK temp = p; 
     char *mob,*name; 
     FILE *fp = fopen(fname,"r"); 

     if (!fp) 
     return temp; 

     while (fscanf(fp,"%ms %ms",&name,&mob)!=EOF) { 
     temp->next = malloc(sizeof(Contact));  
     temp = temp->next; 
     temp->name = name;  
     temp->mobileno = mob;  
     printf("%s %s\n",name,mob);  
     } 

     fclose(fp); 
     temp->next = p;  
     return p; 
    }