2017-11-25 13 views
-1

나는 자동차 구입을 시뮬레이트하는 프로그램을 작성하고 있습니다. 이 프로그램은 처음에는 제대로 작동하지만 구매가 완료되고 프롬프트에 이름을 묻는 메시지가 표시되면 gets()은 입력을 검색하지 않습니다. 여기 내 코드가있다.gets(); 함수가 C에서 두 번째 루프의 입력을 기다리지 않습니다.

#include <stdio.h> 

int i; 
int j=1; 
int prices[5] = { 24000,28000,25000,20000,120000 }; 
int invent[5] = { 5,2,3,8,2 }; 
int purchased[5] = { 0, 0, 0, 0, 0 }; 

int main() 
{ 
    char name[50]; 

    printf("Welcome to Buy-a-Car!\nPlease enter your name:\n"); 
    gets(name); 
    printf("Welcome, %s. Here is our available inventory.\n", name); 
    sale(); 
    return 0; 
} 

void sale() 
{ 
    while (i>0, j != 0) { 
     printf("1. Toyota Camry  %d %d\n2. Honda CRV   %d %d\n3. Honda Accord  %d %d\n4. Hyundai Elantra %d %d\n5. Audi R8   %d %d", invent[0], prices[0], invent[1], prices[1], invent[2], prices[2], invent[3], prices[3], invent[4], prices[4]); 
     printf("\nWhich car would you like to purchase?\n"); 
     scanf("%d", &i); 
     i = i - 1; 
     printf("How many would you like to purchase?\n(Note: To checkout, please press 0.)\n"); 
     scanf("%d", &j); 
     if (j > invent[i]) 
      printf("I'm sorry, that number is insufficient. Please try again.\n"); 
     else 
      invent[i] = invent[i] - j; 
     purchased[i] = j; 
    } 
    checkout(); 
} 
void checkout() 
{ 
    printf("Review of transaction:\n1. Toyota Camry  %d %d\n2. Honda CRV  %d %d\n3. Honda Accord  %d %d\n4. Hyundai Elantra %d %d\n5. Audi R8   %d %d", purchased[0], prices[0], purchased[1], prices[1], purchased[2], prices[2], purchased[3], prices[3], purchased[4], prices[4]); 
    int total; 
    for (i = 0; i < 5; i++) 
    { 
     total = total + (purchased[i] * prices[i]); 
    } 
    printf("\n\nTotal: %d\n\n\n", total); 

    j = 1; 
    int purchased[5] = { 0, 0, 0, 0, 0 }; 
    main(); 
} 
+0

사용중인 운영 체제는 무엇입니까? 또한'gets()'함수는 본질적으로 안전하지 않기 때문에 오래 전에 사용되지 않았다는 점을 지적하고자합니다. 아마'scanf()'또는'gets_s()'와 교환해야한다. – paulotorrens

+0

Windows 10. _s 함수를 인식하지 못하는 온라인 컴파일러를 사용하고 있습니다. 데이터 손실 우려가 없으면 scanf를 사용합니다 (예 : 고객이 성과 이름을 입력하면 scanf는 첫 번째로만 읽음). –

+0

프로그램이 어떻게 종료되어야합니까? – jwdonahue

답변

0

그것은 왜냐하면 사용 scanf와, 용도는 scanf ("%의 D %의 C *의"& VAR) 후 버퍼에 '\ n'CHAR; % * c는 gets를 사용할 때 '\ n'이 줄 건너 뛰는 것을 방지합니다.

gets는 안전하지 않습니다. fgets (& str, sizeof (str), stdin);

0

scanf()을 실행 한 후에는 입력 (및 이전의 내용)이 입력 버퍼에 남아 있습니다. 이처럼 지울 수 있습니다

scanf("%*[\n]%*c"); 

또는

while(getchar() != '\n'); 

지금 gets()는 빈 문자열을 반환하지 않습니다. 하지만 어쨌든, 은 극도로입니다. 대신 fgets 또는 scanf("%[^\n]")을 사용하십시오.

fgets(name, sizeof(name), stdin); 
// or 
scanf("%[^\n]", name); 

게다가, 은 프로그램 어디에서 main()를 호출하지 않습니다. 그것의 행동은 정의되지 않았다. 전체 기능을 다른 기능으로 랩핑하고 루프를 사용할 수 있습니다. 무한 재귀 호출은 분명히 스택을 부 풀리게 될 것입니다.