2015-05-25 92 views
4

我想打印所有輸入的元素。相反,我的代碼打印最近輸入的元素兩次。結構字符串數組打印最後輸入的元素

這裏是我的代碼:

#include<stdio.h> 
void f(struct ar *a); 
void d(struct ar *a); 
struct ar 
{ 
    char name[50]; 
}; 
int main() 
{ 
    struct ar a; 
    f(&a); 
    d(&a); 
} 
void f(struct ar *a) 
{ 
    int i; 
    for(i=0;i<2;i++) 
    { 
     printf("enter name:"); 
     gets(a->name); 
    } 
} 
void d(struct ar *a) 
{ 
    int i; 
    for(i=0;i<2;i++) 
    { 
     puts(a->name); 
    } 
} 

例如:

輸入

name:john 

name:kendall 

輸出

kendall 

kendall 
+3

您不應該使用'gets()'使用'fgets()'來代替。這是* gcc *對它的說明**警告:'gets'函數是危險的,不應該被使用。** –

+0

您需要創建一個鏈表。 [鏈接的數據結構](http://en.wikipedia.org/wiki/Linked_data_structure) – chengpohi

+3

因此,在你的循環中,你可以兩次獲取/打印「a-> name」,而不必將它移動到任何地方。那麼你期望得到什麼? –

回答

3

這是因爲要覆蓋在每個迭代的值。

可以在main()創建一個數組並通過陣列的功能,這樣的值存儲在不同的地方,而不是你總是相同的結構實例傳遞給gets(),從而覆蓋原來的值,所以印刷循環打印出相同的數據兩次。

下面演示如何當談到傳遞數組

#include <stdio.h> 

struct Data 
{ 
    char name[50]; 
}; 

void readData(struct Data *array); 
void showData(struct Data *array); 

int main() 
{ 
    struct Data array[2]; 

    readData(array); 
    showData(array); 
} 

void readData(struct Data *array) 
{ 
    int i; 
    for (i = 0 ; i < 2 ; i++) 
    { 
     printf("enter name: "); 
     fgets(array[i].name, sizeof(array[i].name), stdin); 
    } 
} 

void showData(struct Data *array) 
{ 
    int i; 
    for (i = 0 ; i < 2 ; i++) 
    { 
     printf("%s", array[i].name); 
    } 
} 

另外,不要偷懶命名標識,即使是一個簡單的演示,他們幫助使程序意圖明確,他們幫助你保持它永遠,如果你認爲這並不重要,那麼當你在一個真實的生活項目上工作時,恐怕你會遇到很多問題。

+0

謝謝你的回答,我會考慮你的建議 – eisenheim

0

在這裏,您正在兩次輸入相同變量的輸入。所以發生了什麼:

  • 在第一次迭代中,輸入存儲在ar->name中。第一個輸入是john,所以ar->name="john"
  • 在下一次迭代中,輸入也被存儲在ar->name中。所以如果你的輸入是kendall,那麼ar->name="kenadall"

出於這個原因,john值過得去kendall覆蓋,當你打印你所得到的kendall值。

0

有一個Linked List做同樣的事情:

#include <stdio.h> 
#include <stdlib.h> 


struct Data 
{ 
    char name[50]; 
    struct Data *next; 
}; 

struct Data *readData(); 
void showData(struct Data *array); 

int main() 
{ 
    struct Data *array; 

    array = readData(); 
    showData(array); 
} 

struct Data *readData() 
{ 
    int i; 
    struct Data *tmp = NULL; 
    struct Data *head = NULL; 
    struct Data *end = head; 

    for (i = 0 ; i < 2 ; i++) 
    { 
     tmp = (struct Data *)malloc(sizeof(struct Data)); 
     printf("enter name: "); 
     fgets(tmp->name, sizeof(tmp->name), stdin); 
     if (head == NULL) { 
      head = tmp; 
     } else { 
      end->next = tmp; 
     } 
     end = tmp; 
    } 
    return head; 
} 

void showData(struct Data *array) 
{ 
    int i; 
    struct Data *a = array; 
    while(a != NULL) { 
     printf("%s\n", a->name); 
     a = a->next; 
    } 
} 
0

在行

gets(a->name); 

您記錄每次for循環運行用戶輸入到同一個地方。相反,嘗試類似於

#include<stdio.h> 

struct Name 
{ 
    char first[50]; 
    char last[50]; 
}; 

void recordName(struct Name *name); //writes Name structs 
void reportName(struct Name *name); //prints contents of Name structs 


int main() 
{ 
    struct Name test_Name; 

    recordName(&test_Name); 
    reportName(&test_Name); 

    return 0; 
} 

void recordName(struct Name *name) 
{ 
    printf("enter first Name: "); 
    fgets(name->first,sizeof(name->first),stdin); 

    printf("enter last Name: "); 
    fgets(name->last,sizeof(name->last),stdin); 
} 


void reportName(struct Name *name) 
{ 
    printf("%s%s",name->first, name->last); 
}