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

C语言调用strncmp传入数组第i位地址比较字符串失败问题排查

问题原因
  • 核心原因是strncmp匹配长度计算错误:
    sizeof("title=")会将字符串末尾的\0也计入长度,title=本身只有6个有效字符,sizeof返回值为7,strncmp会强制比较7个字符,但arr中title=后紧跟的是参数值samsung,不存在\0,第7位字符不匹配,导致判定始终失败。
  • 次要逻辑问题:
  1. 匹配到title=后,你初始化x=0读取的是arr数组起始位置(也就是add?的位置)的内容,和title的参数值完全无关。
  2. process函数中匹配到add?调用save_ad后没有终止循环的逻辑,会重复遍历后续字符。
解决方法
  1. 将strncmp的长度参数替换为strlen("title="),只比较6个有效字符即可完成匹配。
  2. 匹配到title=后,从i + strlen("title=")的位置开始读取参数值,终止条件设为遇到&、空格或者\r/\n即可。
  3. process中调用save_ad后添加break或者对应返回值,避免重复处理。
修正后的代码

save_ad函数

void save_ad(int n,char arr[n])
{
    int i=0;
    int price=0;
    char title[100] = {0};
    
    printf("entered\n");
    // 提前减去匹配字符串长度,避免越界访问
    while(i < n - strlen("title="))
    {
        if(strncmp(&arr[i], "title=", strlen("title=")) == 0)
        {
            int x = 0;
            int pos = i + strlen("title=");
            // 遇到参数终止符判断,HTTP请求路径和参数之间用空格分隔,不同参数之间用&分隔
            while(pos < n && arr[pos] != '&' && arr[pos] != ' ' && arr[pos] != '\r' && arr[pos] != '\n')
            {
                title[x] = arr[pos];
                x++;
                pos++;
            }
            title[x] = '\0'; // 给字符串补末尾终止符
            printf("提取到的title为:%s\n", title);
            break; // 匹配到目标参数直接退出循环,无需继续遍历
        }
        i++;
    }
    printf("\n");
}

process函数修改部分

if(strncmp(&buffer[i],"add?",strlen("add?"))==0)
{
    save_ad(size-i, &buffer[i]);
    break; // 处理完add请求直接退出循环,避免重复处理
}

内容的提问来源于stack exchange,提问作者user786

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:09:02