Нужно вывести два набора из двух строк, но когда в первый scanf вставлена ​​только одна строка, вывод испорчен - PullRequest
0 голосов
/ 02 декабря 2018

Это мой текущий код:

#include <stdio.h>
// FIXME include the string library

int main(void) {
   char userService1[50];
   char userService2[50];
   char userService3[50];
   char userService4[50];
   int price1;
   int price2;


   printf("Davy's auto shop services\nOil change -- $35\nTire rotation -- $19\nCar wash -- $7\nCar wax -- $12\n\n");
   printf("Select first service:\n");
   scanf("%s%s",&userService1,&userService2);
   printf("Select second service:\n\n");
   scanf("%s%s",&userService3,&userService4);
   printf("Davy's auto shop invoice\n\n");


   if(strcmp(userService1,"Oil") == 0 && strcmp(userService2,"change")==0){
    printf("Service 1: Oil change, $35\n"); 
    price1 = 35; 
   }

   else if(strcmp(userService1,"Tire") == 0 && strcmp(userService2,"rotation")==0){
    printf("Service 1: Tire rotation, $19\n"); 
    price1 = 19;
   }

   else if(strcmp(userService1,"Car") == 0 && strcmp(userService2,"wash")==0){
    printf("Service 1: Car wash, $7\n");
    price1 = 7;
   }

   else if(strcmp(userService1,"Car") == 0 && strcmp(userService2,"wax")==0){
    printf("Service 1: Car wax, $12\n");  
    price1 = 12;
   }

   else{
      printf("Service 1: No service\n");
      price1 = 0;
   }

   if(strcmp(userService3,"Oil") == 0 || strcmp(userService4,"change")==0){
      printf("Service 2: Oil change, $35\n\n");
      price2 = 35;
   }

   else if(strcmp(userService3,"Tire") == 0 || strcmp(userService4,"rotation")==0){
      printf("Service 2: Tire rotation, $19\n\n");
      price2 = 19;
   }

   else if(strcmp(userService3,"Car") == 0 || strcmp(userService4,"wash")==0){
      printf("Service 2: Car wash, $7\n\n");
      price2 = 7;
   }

   else if(strcmp(userService3,"Car") == 0 || strcmp(userService4,"wax")==0){
      printf("Service 2: Car wax, $12\n\n");
      price2 = 12;
   }
   else{
      printf("Service 2: No service\n\n");
      price2 = 0;
   }

   int price = price1 + price2;
   printf("Total: $%d\n", price);
   return 0;
}

Код принимает два ввода (выбранные услуги).Если первый вход «-», а второй «Car wax», это текущий выход:

Davy's auto shop services
Oil change -- $35
Tire rotation -- $19
Car wash -- $7
Car wax -- $12

Select first service:
Select second service:

Davy's auto shop invoice

Service 1: No service
Service 2: No service

Total: $0

Однако, это желаемый вывод:

Davy's auto shop services
Oil change -- $35
Tire rotation -- $19
Car wash -- $7
Car wax -- $12

Select first service:
Select second service:

Davy's auto shop invoice

Service 1: No service
Service 2: Car wax, $12

Total: $12

Я предполагаюэто связано с тем фактом, что когда одиночный дефис вводится в первый scanf, это всего лишь одна строка и поэтому портит следующую scanf, но я не знаю, как решить эту проблему.

1 Ответ

0 голосов
/ 03 декабря 2018

Как указано chux в комментариях, лучше использовать fgets() вместо scanf(), если вы не знаете, сколько слов будет на стандартном вводе,Затем вы можете проанализировать вывод fgets() по strtok(), который разбивает найденную строку на отдельные слова.Для этого, пожалуйста, замените следующие строки в вашем коде:

printf("Select first service:\n");
scanf("%s%s",&userService1,&userService2);
printf("Select second service:\n\n");
scanf("%s%s",&userService3,&userService4);

следующим кодом (да, это нехорошо, но я оставляю вам дальнейшие улучшения в качестве упражнения):

char line[50];
char* token;

printf("Select first service:\n");
if (fgets(line, sizeof line, stdin)){
    token = strtok(line, " ");
    if (token){
        strcpy(userService1, token);
        token = strtok(NULL, " ");
        if (token){
            strcpy(userService2, token);
        }
    }
}

printf("Select second service:\n\n");
if (fgets(line, sizeof line, stdin)){
    token = strtok(line, " ");
    if (token){
        strcpy(userService3, token);
        token = strtok(NULL, " ");
        if (token){
            strcpy(userService4, token);
        }
    }
}

Вы также должны добавить следующее:

#include <string.h>

Но у вас есть другая ошибка в вашем коде.Пожалуйста, замените || на && в следующих строках:

if(strcmp(userService3,"Oil") == 0 || strcmp(userService4,"change")==0){
else if(strcmp(userService3,"Tire") == 0 || strcmp(userService4,"rotation")==0){
else if(strcmp(userService3,"Car") == 0 || strcmp(userService4,"wash")==0){
else if(strcmp(userService3,"Car") == 0 || strcmp(userService4,"wax")==0){

Тогда вы должны получить ожидаемый результат.

Код на Ideone

Примечание: приведенный выше код работает для случаев, когда вы ожидаете не более двух слов на вход.Если вы хотите обработать больше слов, имеет смысл заключить strtok() в цикл while, как показано в в этом примере .

...