2017-03-25 15 views
-2

사용자가 도입 한 값을 스캔하여 * 크기 포인터를 다른 함수에 전달할 때 문자 (book._title)에 대한 가비지 값을 얻고 있습니다. 나는 그 이유를 정말로 이해할 수 없다. 나는 C로 프로그래밍 할 때 새로운 것이므로 어떤 도움을 주시면 감사하겠습니다. 감사.스캔 할 때 가비지 값을 가져 와서 포인터로 다른 함수에 전달

void addBook(struct Book book[], int *size) { 


     if(*size < MAX_BOOKS){ 


      printf("ISBN: "); 
      scanf("%d", &book[*size]._isbn); 

      printf("Title: "); 
      scanf("%*c%[^\n]", &book[*size]._title[MAX_TITLE_SIZE]); 

      printf("Year: "); 
      scanf("%d", &book[*size]._year); 

      printf("Price: "); 
      scanf("%f", &book[*size]._price); 

      printf("Quantity: "); 
      scanf("%d", &book[*size]._qty); 

      printf("The book is successfully added to the inventory.\n"); 
      printf("\n"); 
      (*size)++; 

     } 
     else { 
       printf("The inventory is full\n"); 
      } 
    } 
+0

'_title [MAX_TITLE_SIZE]'는'char' 배열에서 범위를 벗어난 색인 생성과 매우 유사합니다. 그게 무슨 의미 일까? –

+0

이 줄 :'scanf ("% d", & book [* size]. isbn);는 게시 된 코드의 문제점 중 하나입니다. 여기에 전형적인 ISBN이있다 :'978-1-59327-220-3' 주목할 점은'scanf()'에 대한 호출이 반환 값 (매개 변수 값이 아님)이 있어야 동작이 성공적으로 이루어 졌음을 확인하는 것이다. . 그런 다음 더 중요한 것은 '% d'은 선행 +/- char 다음에 최대 ########### 문자가있는 숫자까지 (선택적으로) 입력합니다. +/- 2 기가. 일반적인 ISBN 9gig가 너무 크고 자리가 아닌 '-'가 포함되어 있습니다. 제안 :'scanf()'를 호출 할 때'scanf ("% * c % [^ \ n]", & book [* size] ._ title [MAX_TITLE_SIZE]);': 1) 문자 배열 – user3629249

+0

을 입력하십시오. 작업이 성공적으로 수행되었는지 확인하기 위해 항상 반환 된 값을 확인하십시오. 2) '% s'또는 '% [^ \ n]'입력/변환 지정자를 사용할 때 항상 입력 버퍼의 길이보다 작은 MAX CHARACTERS 수정자를 사용하십시오 (scanf는 항상 NUL 바이트를 추가합니다) 그래서 입력 버퍼 오버런 수 없습니다. 입력 버퍼 오버런은 정의되지 않은 동작이며 seg fault 이벤트로 이어질 수 있습니다. – user3629249

답변

0

book.title을 초기화했는지 확인하십시오.