C语言字符串比较问题:数组与输入比对if判断恒为false求助
问题排查与修复说明
现存问题一览
- 字符串比较逻辑错误:C语言中不能用
==直接对比两个字符串内容,==只会对比两个字符串的内存起始地址,永远不会相等。你需要引入<string.h>头文件,调用strcmp(字符串1, 字符串2)函数,返回值为0代表两个字符串内容完全一致。 - 未遍历结构体数组:代码中变量
i始终固定为0,只会比对数组第一个元素Asus_365,哪怕输入其他存在的商品也会判定不存在。你需要遍历所有length个元素,找到匹配的商品后再走后续逻辑。 - scanf格式符错误:读取购买数量的
scanf格式符写为"d",缺少%,应该改为"%d",否则无法正确读取输入的数字。 fflush(stdin)属于未定义行为:标准C中fflush仅对输出流生效,用于清空输入流属于错误用法,不同编译器运行效果不稳定,建议直接移除。- 带空格的商品名无法正确读取:
scanf("%s")遇到空格就会终止读取,你预置的商品中Acer Alpha touch包含空格,用%s无法读全完整名称,建议改用fgets读取整行输入,同时处理掉末尾的换行符即可。 - 输入参数错误:
scanf("%s", &name)中的&多余,数组名本身就是首地址,直接传入name即可。
修正后完整代码
#include <stdio.h> #include <string.h> // 引入字符串处理头文件 #include <stdlib.h> struct category { char item_name[50]; int item_quantity; float item_price; }; void items_search (struct category a[], int length) { char answer[10] = "yes"; // 调整数组大小避免输入溢出 int number = 0; char name[200]; int i = 0; int found_index = -1; // 记录匹配到的商品下标 printf ("你要找什么商品?\n"); // 读取整行输入,处理末尾换行符 fgets(name, sizeof(name), stdin); name[strcspn(name, "\n")] = '\0'; // 遍历所有商品找匹配项 for (i = 0; i < length; i++) { if (strcmp(a[i].item_name, name) == 0) { found_index = i; break; } } if (found_index != -1) { printf ("你需要多少件该商品?"); scanf ("%d", &number); // 吃掉scanf残留的换行符 getchar(); if (number == a[found_index].item_quantity) { printf ("库存足够,是否确认下单?\n"); fgets(answer, sizeof(answer), stdin); answer[strcspn(answer, "\n")] = '\0'; if (strcmp(answer, "yes") == 0) { puts ("已下单"); } else { puts ("已取消订单"); } } else { printf ("该商品仅剩%d件,是否取消订单?\n", a[found_index].item_quantity); fgets(answer, sizeof(answer), stdin); answer[strcspn(answer, "\n")] = '\0'; if (strcmp(answer, "yes") == 0) { puts ("已取消订单,是否延后购买?"); fgets(answer, sizeof(answer), stdin); answer[strcspn(answer, "\n")] = '\0'; if (strcmp(answer, "yes") == 0) { puts ("已下单"); } else { puts ("已取消订单"); } } else { puts ("已下单"); } } } else { printf ("查询的商品不存在\n"); } } int main (void) { struct category laptops[] = { {"Asus_365", 7, 499.00}, {"Lenovo_L49", 30, 699.91}, {"HP_Alien", 20, 649.99}, {"Acer Alpha touch", 10, 899.99} }; items_search (laptops, sizeof (laptops) / sizeof (struct category)); return 0; }
内容的提问来源于stack exchange,提问作者random
相关产品推荐
相关产品推荐

