C语言调用strncmp传入数组第i位地址比较字符串失败问题排查
问题原因
- 核心原因是
strncmp匹配长度计算错误:sizeof("title=")会将字符串末尾的\0也计入长度,title=本身只有6个有效字符,sizeof返回值为7,strncmp会强制比较7个字符,但arr中title=后紧跟的是参数值samsung,不存在\0,第7位字符不匹配,导致判定始终失败。 - 次要逻辑问题:
- 匹配到
title=后,你初始化x=0读取的是arr数组起始位置(也就是add?的位置)的内容,和title的参数值完全无关。 process函数中匹配到add?调用save_ad后没有终止循环的逻辑,会重复遍历后续字符。
解决方法
- 将
strncmp的长度参数替换为strlen("title="),只比较6个有效字符即可完成匹配。 - 匹配到
title=后,从i + strlen("title=")的位置开始读取参数值,终止条件设为遇到&、空格或者\r/\n即可。 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
相关产品推荐
相关产品推荐

