【问题标题】:Have to output two sets of two strings, but when only one string is inserted to the first scanf, the output is messed up必须输出两组两个字符串,但是当第一个scanf只插入一个字符串时,输出就乱了
【发布时间】:2018-12-02 05:57:23
【问题描述】:

这是我当前的代码:

#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;
}

代码有两个输入(选定的服务)。如果第一个输入是“-”,第二个是“汽车蜡”,则这是当前输出:

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("%s%s",... 换成fgets() 换成宽缓冲区,然后将缓冲区解析成userService1, userService2
  • 提示:启用所有警告以节省时间。我希望scanf("%s%s",&amp;userService1,&amp;userService2); 会警告不匹配的指针/说明符。
  • 这样使用字符串和scanf函数:scanf("%s%s", userService1, userService2); scanf("%s%s", userService3, userService4);

标签: c string scanf


【解决方案1】:

正如 chux 在 cmets 中所提到的,如果您不知道标准输入上有多少字,最好使用 fgets() 而不是 scanf()。然后,您可以通过strtok() 解析fgets() 的输出,它将检索到的行拆分为单独的单词。为此,请在您的代码中替换以下行:

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>

但是您的代码中还有另一个错误。请将以下几行中的|| 替换为&amp;&amp;

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){

那么你应该得到预期的输出。

Code on Ideone

注意:上面的代码适用于您希望每个输入不超过两个单词的情况。如果您想处理更多单词,将strtok() 包装在while 循环中是有意义的,如this example 所示。

【讨论】:

  • @Cheeseriot:我的回答对你有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2019-12-31
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2022-07-06
  • 2022-10-01
相关资源
最近更新 更多