2014-12-12 2 views
3

나는 초보자 다. 오늘 나는 문제에 직면했다. 우리가 입력 다음 주면 책에 따라 :예기치 않은 C 프로그램의 종료

Enter names, prices and no. of pages of 3 books 

A 100.00 354 
C 256.50 682 
F 233.70 512 

출력은 실행에 갑자기 종료 동안

And this is what you entered 

A 100.000000 354 
C 256.500000 682 
F 233.700000 512 

을 다음과 같이 올 것입니다. 다음과 같이

코드는 다음과 같습니다. \n 버퍼에있는 경우 그래서 읽어되지 않습니다

#include<stdio.h> 
#include <ctype.h> 
main() 
{ 
    struct book 
    { 
    char name ; 
    float price ; 
    int pages ; 
    } ; 
    struct book b1, b2, b3 ; 

    printf ("\nEnter names, prices & no. of pages of 3 books\n") ; 
    scanf ("%c %f %d", &b1.name, &b1.price, &b1.pages) ; 
    scanf ("%c %f %d", &b2.name, &b2.price, &b2.pages) ; 
    scanf ("%c %f %d", &b3.name, &b3.price, &b3.pages) ; 

    printf ("\nAnd this is what you entered") ; 
    printf ("\n%c %f %d", b1.name, b1.price, b1.pages) ; 
    printf ("\n%c %f %d", b2.name, b2.price, b2.pages) ; 
    printf ("\n%c %f %d", b3.name, b3.price, b3.pages) ; 
} 
+4

무엇이 당신의 질문입니까? – dg99

+0

질문 나는 다음 코드를 입력으로 줄 수 없다 : 100.000 354 C 256.5 682 C 233.7 512 –

+1

main은'int main (void)'이고'return 0; – abelenky

답변

6

그냥 넣어 공간 %c 전에

그래서이 작동합니다 :

scanf(" %c %f %d", &b1.name, &b1.price, &b1.pages); 
scanf(" %c %f %d", &b2.name, &b2.price, &b2.pages); 
scanf(" %c %f %d", &b3.name, &b3.price, &b3.pages); 
    //^ See the space here, if there is no space but still a '\n' in the buffer it get's read 
+0

덕분에 작동한다. –

+3

@ user3501405 환영합니다! 좋은 하루 보내십시오. (BTW : 가장 도움이 된 답변을 수락하고 문제를 해결할 수 있습니다.) – Rizier123

1

문제는 scanf()가 문자열 검색과 관련하여 끔찍한 손상을 입은 것입니다. 특히, scanf()는 문자열을 즉시 할당하고 (malloc()을 통해) 입력에서 적절한 부분 문자열을 할당 할 수 없습니다.

귀하의 코드는 하나의 문자 구문 분석 : %c

명백한 개선 - 그렇지 않기 때문에, 하나가 작동하지 않습니다 - 구조체의 char name[40] 같은 것을 선언 한 다음 스캔 코드에 %40c을 사용하기를 문자열에 대한 관심이 끝납니다. 숫자 등 항상 입력에서 40자를 소모합니다.

scanf()가 읽을 때까지 읽는 경향이 무엇인지, 원하는 이유는 코드가 조기에 끝나는 이유입니다.

따라서 일반적인 해결책은 입력을 한 번에 한 줄 씩 (예 : fgets() 또는 새로운 라이브러리 함수 getline()을 통해) 읽은 다음 코드를 사용하여 해당 부분을 적절한 부분으로 슬래시하는 것입니다.

+1

죄송하지만 목표는 문자열이 아닌 문자를 입력하는 것이 었습니다. . 왜 메모리를 낭비해야 하는가? –