You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:15:04