что-то не так со сравнением строк - PullRequest
0 голосов
/ 03 декабря 2018

Это код, который у меня до сих пор:

#include <stdio.h>
#include <string.h>

int main(void) {
   char userService1[50];
   char userService2[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");
   fgets(userService1,13,stdin);
   printf("Select second service:\n\n");
   fgets(userService2,13,stdin);
   printf("Davy's auto shop invoice\n\n");

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

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

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

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

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

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

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

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

   else if(strcmp(userService2,"Car 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;
 }

, когда вход:

Tire rotation
Car wash

Выход:

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: Tire rotation, $19
Service 2: Car wash, $7

Total: $26

Когда вводится любая другая комбинация услуг, например:

Oil change
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: Oil change, $35
Service 2: Car wax, $12

Total: $47

Я не уверен, что проблема в сравнении строк в Tire Rotation?Если есть, я не могу найти это.Буду признателен за любую помощь в решении этой проблемы!

Ответы [ 2 ]

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

У вас есть две проблемы:

  1. Вы используете fgets() немного неправильно.Похоже, вы указываете второй параметр этой функции как максимальное количество символов, которое вы ожидаете в действительном ответе, но

    1. Вместо этого вы должны указать количество байтов, доступных в указанном буфере (В данном случае 50).
    2. Функция использует один байт для ограничителя строки, что уменьшает число байтов для фактических данных на единицу.
    3. На самом деле вам нужно 15 байтов, чтобы успешно прочитать всеstring `" Вращение шины \ n "после того, как вы учли символы новой строки и терминатора.
    4. Вы, кажется, предполагаете, что fgets() читает целую строку.Это не совсем так.Он прекращает чтение, когда читает новую строку, да, но также прекращает чтение, когда ему не хватает места в целевом буфере.Когда последний предшествует первому, хвост строки остается для чтения следующим fgets().
  2. Ваш набор сравнений строк для второго сервиса опустите завершающий символ новой строки для строк сравнения.

Таким образом, говоря fgets() истинную длину буфера и обеспечивая последовательно правильную обработку новых строк, следует позаботиться о ваших проблемах.

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

Я не уверен, что проблема со сравнением строк вращения шин?

strcmp(userService1,"Tire rotation\n") не может сравниться как равное из-за 13 в fgets(userService1,13,stdin); Я ожидал бы приминимум 15.

13 позволяет fgets() читать до 12 символов, оставляя остаток в stdin, чтобы испортить следующий ввод.

Использовать fgets(userService1, sizeof userService1,stdin); как char userService1[50]; достаточно большой.

...