2016-08-20 1 views
-3

구조체에 배열을 저장하면 함수에 accept가 전달되어 구조체에 값을 저장할 수 있습니다. accept 함수 내부의 루프는 scanf까지만 한 번만 반복합니다.포인터를 사용하여 구조체 배열에 액세스 중입니다. (코드에 문제가 있음)

struct emp 
{ 
    int age; 
    char name[20]; 
    float sal; 
}; 

void display(struct emp *); 
void accept(struct emp *); 

void main() 
{ 
clrscr(); 
struct emp E[3]; 
accept(E); 
display(E); 
getch(); 
} 

void accept(struct emp *p) 
{ 
int i; 
for(i=0;i<3;i++) 
{ 
    printf("Enter age, name and sal: "); 
    scanf("%d %s %f",&(p+i)->age,(p+i)->name,&(p+i)->sal); 
} 
} 

void display(struct emp *p) 
{ 
int i; 
for(i=0;i<3;i++) 
{ 
printf("Result: %d %s %f",(p+i)->age,(p+i)->name,(p+i)->sal); 
} 
} 

코드를 수정하십시오.

+0

무엇이 발생합니까? 프로그램이 멈추거나, 멈추거나, 디스플레이 기능이 호출 되는가? ...? – UnholySheep

+0

아직 누락 된 정보 : 무엇을 입력하려고합니까? 디버거를 사용하여 함수를 중단하면 어떻게됩니까? – UnholySheep

+0

입력 내용 중 하나 표시 – Shahid

답변

1

당신이 공백 문자로 입력 name을 복용하고,이 방법을 시도해보십시오

scanf("%d %[^\n]s %f",&(p+i)->age,(p+i)->name,&(p+i)->sal); 

N.B을 :는 또한 clrscr()getch()을 제거하고 int main() 대신 void main()을 사용했다. 이 때문에 오류가 발생했습니다.

+0

니스 :-). 제발 무슨 일을했는지 ​​설명하십시오, 잘 작동합니다. 감사합니다 –

+0

'% [^ \ n] s'는 공백 문자를 포함합니다. – Shahid

+0

공백 문자를 사용하지 않고 이름을 단 하나뿐입니다. 아직도 ... 그 충돌 –

0

사용하여 시도 :

scanf("%d %s %f\n",&(p+i)->age,(p+i)->name,&(p+i)->sal); 
+0

float 값을 입력하면 scanf를 중단 할 입력이 필요하므로 \ n이 해당 입력으로 작동합니다. Enter 키를 누르면 컨트롤이 해제됩니다. –

+0

죄송합니다. 행운을 빕니다. ( –

-1

대신 얻는다() 함수를 사용하여 사용자 입력 (전체 라인을 읽는) 판독 시도 다음 변수로 데이터를 읽어 sscanf를()를 사용한다. 경우

+0

"['gets()'] (http://en.cppreference.com/w/c/io/gets) 함수는 경계 검사를 수행하지 않으므로이 함수는 버퍼 오버플로에 매우 취약합니다 (프로그램이 표준에서 나타날 수있는 것을 제한하는 환경에서 실행되지 않는 한) 안전하게 사용할 수 없으므로이 기능은 세 번째 정오표에서 C99 표준으로 사용되지 않으며 C11 표준에서 모두 제거되었습니다. " – Quentin

+0

포스터의 초보자 수준 (범죄가 아님)을 감안할 때, 데이터를 읽을 수 있다는 점에서 Quentin은 전문 응용 프로그램을 작성하는 것이 아니라 여기에 목표를 제시합니다. 요점은 단순히 데이터 라인을 읽고 그것들을 처리하는 것인데, OP는 지금 할 수없는 것처럼 보입니다. 그래서 나는 가장 기본적인 형태의 "입력"기능 (그리고 가장 쉬운 방법)을 사용하도록 권장했습니다. 더 "안전한" 함수의 형태는 또 다른 문제이며,이 p에서 OP에 관심이 거의 없다. 우드. 그리고 이것에 대한 downvoting은 비생산적이고 낙심적입니다. 나는 대답을 게시하지 않는 것이 좋습니까? –

+0

무슨 뜻인지 이해합니다. 그러나'gets '를 권고함으로써'fgets'을 피하려고하는 것은 과도하다. OP *는 디자인에 의해 깨지기 쉬운 기능을 사용하는 것을 배우기보다는'fgets'의 크기 매개 변수가 무엇을 하는지를 이해하기 위해 12 초를 추가 할 수있다. 나중에 그것을 알아 듣지 않아야합니다. 'gets '를 권하고 싶다면, 적어도 일시적인 "facilitation"이라고 언급해야합니다. – Quentin