2011-02-09 5 views
0

나는 매우 기본적인 질문을 가지고 있습니다. 양해 해 주셔서 감사합니다.scanf를 사용하는 동적 데이터 구조

필자는 단지 정수 값과 다음 구조체에 대한 포인터가있는 동적 데이터 구조를 사용합니다. 나는 scanf을 사용하여 구조체에 추가하고 끝에 출력을 인쇄하기 위해 5 개의 값을 얻기 위해 사용자 입력을 얻습니다. 구조체에 입력을 얻기 위해 구문에 문제가 있습니다. 나는 아무 소용로, StackOverflow의 구글 주위를 보았다 여기

코드입니다 (너무 기본적인 아마 때문에!) :

#include <stdio.h> 

struct List 
{ 
    int value; 
    struct List *nextaddr; 
}; 

int main() 
{ 
    int int1, int2, int3, int4, int5; 

    printf("please enter the first integer: "); 
    scanf("%d", int1); 
    struct List t1 = {int1}; 

    printf("please enter the second integer: "); 
    scanf("%d", int2); 
    struct List t2 = {int2}; 

    printf("please enter the third integer: "); 
    scanf("%d", int3); 
    struct List t3 = {int3}; 

    printf("please enter the fourth integer: "); 
    scanf("%d", int4); 
    struct List t4 = {int4}; 

    printf("please enter the fifth integer: "); 
    scanf("%d", int5); 
    struct List t5 = {int5}; 

    struct List *first; 

    first = &t1; 
    t1.nextaddr = &t2; 
    t2.nextaddr = &t3; 
    t3.nextaddr = &t4; 
    t4.nextaddr = &t5; 
    t5.nextaddr = NULL; 

    printf("%i\n%i\n%i\n%i\n%i\n",first->value,t1.nextaddr->value,t2.nextaddr->value,t3.nextaddr->value,t4.nextaddr->value); 

    return 0; 
} 

가 어떻게 구조로 사용자 입력을받을 수 있나요?

답변

0

scanf는 같이 정수의 주소를 얻어야한다 : scanf("%d", &int1);

+0

어리석은 실수. 감사! – rick

+0

다른 문제가 있지만'scanf'에 대한 호출이 있다고 생각합니다.하지만'c'를 많이 사용하지 않았습니다. 그냥 시도해보십시오 :). –

1

몇 일반적으로 things-

, (이 경우에로) 연결리스트와 같은 연결 구조로 작업 할 때, 당신을 스택이 아닌 malloc을 사용하여 힙의 오브젝트에 대한 메모리를 할당하십시오. 이것의 배후에있는 이유는 링크 된 구조체의 요소가 그 구조체를 생성하는 함수보다 오래 남아 있기를 원하기 때문에 개별 셀을 스택 할당하면 올바르게 작동하지 않을 수 있다는 것입니다. 당신은 아마 각 셀에 대한 동일 사용자로부터 연결리스트 셀의 내용을 읽고 목록에 추가하는 로직 이후, 후속으로

struct List* entry = malloc(sizeof(struct List)); 

같은를 작성하여 구조를 만들려면 당신은 아마 5 번 코드를 복사하고 싶지 않을 것입니다.

struct List* ReadListEntry(void) { 
    struct List* entry = malloc(sizeof(struct List)); 
    /* ... initialize 'entry' ... */ 

    return entry; 
} 

그 방법은, main에서 코드를 다섯 번이 짧아 질 수 있고, (당신이했던 것 같은) 당신이 코드에서 버그를 발견하면, 당신은 단지 필요 대신,이 같은 함수를 작성 고려 5 번이 아니라 한 번 변경하십시오. 원래의 질문으로

, 나는 문제가 당신이

scanf("%d", myValue); 

대신이 첫 번째 버전은 실행시 충돌을 일으킬 올바르지 가능성이

scanf("%d", &myValue); 

의 작성하는 것입니다 생각 . scanf%d 형식 지정자를 사용할 때마다 포인터을 정수가 아닌 정수로 제공한다고 가정하므로 명시적인 앰퍼샌드가 문제의 원인 일 수 있습니다. 힙 할당 목록 세포를 생산하는 도우미 함수를 사용하는 위의 생각이 결합

,이 같은 함수를 작성하려고 할 수 있습니다 :

struct List* ReadListEntry(void) { 
    struct List* entry = malloc(sizeof(struct List)); 

    scanf("%d", &entry->value); 
    entry->nextaddr = NULL; 

    return entry; 
} 

이를 감안할 때, 당신은 아마 당신의 main를 다시 작성할 수 있습니다 기능은 지금 가지고있는 것보다 훨씬 간단합니다. 나는 그것을 독자에게 연습으로 남겨 둘 것이다. :-)

희망이 있습니다.

+0

이것은 훌륭한 정보입니다 - 나는 당신이 함수를 작성해야한다면 더 많은 것을 작성해야한다는 것을 배우고 있습니다. malloc은 이러한 것들을 처리하는 방법 인 것 같습니다. 특히 값을 무한정 계속 입력하려면 루프를 작성해야합니다. 너를 투표 할 수 있으면 좋겠다! 감사! – rick