簡體   English   中英

字符串比較有問題

[英]something wrong with string comparison

這是我到目前為止的代碼:

#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

我不確定問題是否出在“輪胎旋轉”字符串比較上? 如果有,我似乎找不到。 解決這個問題的任何幫助將不勝感激!

我不確定問題是否出在“輪胎旋轉”字符串比較上?

由於fgets(userService1,13,stdin); 13, strcmp(userService1,"Tire rotation\\n")不能比較相等fgets(userService1,13,stdin); 我希望至少有15個。

13允許fgets()讀取不超過12個字符,其余部分保留在stdin以弄亂下一個輸入。

使用fgets(userService1, sizeof userService1,stdin); 作為char userService1[50]; 足夠大

您有兩個問題:

  1. 您使用fgets()有點錯誤。 您似乎正在將該函數的第二個參數指定為有效響應中期望的最大字符數,但是

    1. 您應改為指定指定緩沖區中的可用字節數(在這種情況下為50)。
    2. 該函數將一個字節用於字符串終止符,從而將實際數據的字節數減少一個。
    3. 一旦考慮了換行符和終止符,實際上需要15個字節才能成功讀取整個字符串“輪胎旋轉\\ n”。
    4. 您似乎假設fgets()讀取了整行。 那不是真的。 是的,它會在讀取換行符時停止讀取,是的,但在目標緩沖區中的空間不足時也會停止讀取。 當后者在前者之前時,該行的尾部留給下一個fgets()讀取。
  2. 您用於第二個服務的字符串比較集將省略比較字符串的結尾換行符。

因此,告訴fgets()真正的緩沖區長度並提供對換行符的一致正確處理應該可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM