c - 必须输出两组两个字符串,但是当只有一个字符串插入到第一个scanf时,输出就乱了

标签 c string scanf

这是我当前的代码:

#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 时,它只是一个字符串,因此会弄乱下一个 scanf,但我不知道如何解决这个问题。

最佳答案

正如 chux 在评论中提到的,最好使用 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>

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

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 所示。 .

关于c - 必须输出两组两个字符串,但是当只有一个字符串插入到第一个scanf时,输出就乱了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577814/

相关文章:

c++ - C 中用 1 替换 0 的宏

c - C 中表达式 (!array_name[index]) 的含义是什么?

c - 调用daemon()和调用fork()、setsid()、fork()等有什么区别?

c - 删除我的 C 字符串前面的空格

c - Segmentation fault和Struct的关系

c - 函数指针 - 变量未初始化

将存储为字符的十六进制字符串转换为C中的十进制

被调用的对象不是函数或函数指针

c - 从C中的字符串中过滤出一个字符

java - Kotlin 字符串最大长度? (带有长字符串的 Kotlin 文件无法编译)