这是我当前的代码:
#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){
然后你应该得到预期的输出。
注意:上面的代码适用于您期望每个输入不超过两个单词的情况。如果您想处理更多单词,则可以将 strtok()
包装在 while
循环中,如 this example 所示。 .
关于c - 必须输出两组两个字符串,但是当只有一个字符串插入到第一个scanf时,输出就乱了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577814/