2015-05-25 2 views
4

Я хочу напечатать все введенные элементы. Вместо этого мой код дважды печатает последний введенный элемент.Строка string array print последний введенный элемент

Вот мой код:

#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()' use '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); 

вы записываете, введенные пользователем на том же месте каждый раз, когда для прогонов цикла. Вместо этого попробуйте что-то вроде

#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); 
} 
Смежные вопросы