2016-08-19 2 views
0

GCC 컴파일러에서 Codeblocks IDE를 사용하고 있습니다.구조체 배열에서 문자 요소를 사용할 때 런타임 오류가 발생하는 이유

구조체에 다른 유형의 요소가있는 구조체 배열을 구현하려고합니다. 지금까지 모든 구조체 배열이 잘 작동합니다. 하지만 변수의 문자 유형을 구조 요소로 사용하면 런타임 오류가 발생합니다. 왜 이런 일이 발생합니까? 코드는 :

#include <stdio.h> 
int main() 
{ 
    struct book 
    { 
     char name ; 
     float price ; 
     int pages ; 
    } ; 
    struct book b[3] ; 
    int i ; 
    for (i = 0 ; i <= 2 ; i++) 
    { 
     printf ("\nEnter name, price and pages ") ; 
     scanf ("%c %f %d", &b[i].name, &b[i].price, &b[i].pages) ; 
    } 
    for (i = 0 ; i <= 2 ; i++) 
     printf ("\n%c %f %d", b[i].name, b[i].price, b[i].pages) ; 
    return 0; 

} 

I는이 문제는 "%의 C"와 같은 형식 문자열 앞에 공백을 사용하여 해결 될 수 있음을 이해해야.

그러나 문자 배열의 경우 gets 함수를 사용하는 동안 여전히 동일한 문제가 발생합니다. 코드는 다음과 같습니다

#include <stdio.h> 
int main() 
{ 
    int i; 
    struct Bookinfo 
    { 
     char bname[20]; 
     int pages; 
     int price; 
    }; 
    struct Bookinfo book[3]; 
    for(i=0; i<3; i++) 
    { 
     printf("\nEnter the Name of Book : "); 
     gets(book[i].bname); //This statement creates runtime error 
     printf("\nEnter the Number of Pages : "); 
     scanf(" %d",&book[i].pages); 
     printf("\nEnter the Price of Book : "); 
     scanf(" %d",&book[i].price); 
    } 

    printf("\n--------- Book Details ------------ "); 

    for(i=0; i<3; i++) 
    { 
     printf("\nName of Book : %s",book[i].bname); 
     printf("\nNumber of Pages : %d",book[i].pages); 
     printf("\nPrice of Book : %d",book[i].price); 
    } 

    return 0; 
} 
+1

'% c'공백 건너 뛰기 ->' "% c"앞에 공백 넣기 – BLUEPIXY

+0

어떤 오류가 발생하고 있습니까? – Barmar

+2

'% c'은 이전 라인의 끝에있는 개행을 읽습니다. 그렇다면'% f'은 이름을 분석하려고 시도하지만 이름이 숫자가 아니기 때문에 실패합니다. – Barmar

답변

0

샤아는 'A'또는 'B'처럼 하나 개의 문자입니다. 대신 'ABCD'와 같은 문자열을 입력하면 정의되지 않은 동작이 나타날 수 있습니다. 'name'변수의 이름에 따라 문자열이 필요합니다. 어떤 경우에는 문자 배열을 갖도록 구조를 수정해야합니다.

그러나 주석에서 언급했듯이 런타임 오류에 대한 자세한 내용은 제공하는 입력과 마찬가지로 디버그에 도움이됩니다.

+0

동일한 프로그램을 문자 배열에 사용했는데 정상적으로 작동했습니다. PS. 나는 하나의 문자로만 가치를 부여하고있다. –

+0

음 ... 그러면 scanf가 작동하는 방식과 관련이있을 수 있습니다. 입력 내용은 정확히 무엇입니까? – user3336523

+0

임의의 입력에 오류가 발생했습니다. 같은 g 6 등 –

2

문제는 %c이 보이는 문자를 읽는 것이 아니라 제어 문자를 포함한 모든 문자를 읽는 것입니다.

는 귀하의 의견은 다음과 같다 경우

a 1.23 5 
b 2.34 10 
c 10.98 7 

첫 번째 줄은 book[0].pagesbook[0].pricebook[0].namea, 1.235을 읽습니다. 따라서 첫 번째 행을 읽는 것이 올바르게 작동합니다.

이 시점에서 입력의 다음 문자는 첫 번째 줄 끝의 줄 바꿈 문자입니다. 따라서 다음 scanf을 수행하면 \nbook[1].name으로 읽혀집니다. 그런 다음 book[1].priceb을 읽으려고하지만 올바른 부동 소수점 숫자가 아니기 때문에 실패합니다.

해결 방법은 %c 앞에 공백을 넣는 것입니다. 이것은 %c 형식으로 내용을 읽으려고하기 전에 scanf이 공백 문자를 건너 뛰도록 지시합니다. 따라서 개행 문자를 건너 뛰고 첫 번째 문자를 books[i].name에 넣습니다.

scanf (" %c %f %d", &b[i].name, &b[i].price, &b[i].pages) ;