C与汇编混合编程中字符串长度验证异常问题求助
字符串长度验证异常排查与解决
问题现象
输入长度小于50的字符串,程序错误提示"String exceeds 50 characters.",编译命令为gcc -Wall -g string.c -o string。
排查步骤与解决建议
1. 添加调试输出确认真实长度
在长度计算后插入调试代码,明确程序实际计算的字符串长度:
// Validate string length int length = strlen(temp); printf("Debug: Input string: '%s', calculated length: %d\n", temp, length); // 新增调试行 if (length > 50) { printf("String exceeds 50 characters.\n"); return 1; }
运行后观察输出,直接判断是长度真的超标,还是逻辑判断出现异常。
2. 修正不规范的字符串字面量写法
代码中使用实际换行而非转义字符\n的写法虽符合C标准,但易引发混淆,建议修改:
- 将
temp[strcspn(temp, " ")] = '\0';改为:temp[strcspn(temp, "\n")] = '\0'; - 将
printf("String exceeds 50 characters. ");改为:printf("String exceeds 50 characters.\n");
3. 区分字节长度与实际字符数(多字节字符场景)
若输入包含中文、日文等多字节字符,strlen返回的是字节数而非实际字符数。如果需求是限制字符数不超过50,需使用多字节字符处理函数:
#include <wchar.h> #include <locale.h> int main() { // ... 原有代码 ... setlocale(LC_ALL, ""); // 初始化本地化环境,确保多字节字符处理正常 int char_count = mbstowcs(NULL, temp, 0); // 计算实际字符数 if (char_count == -1 || char_count > 50) { printf("String exceeds 50 characters.\n"); return 1; } // ... 原有代码 ... }
4. 确认fgets的截断行为
fgets最多读取sizeof(temp)-1个字符(即100字节)并自动添加空终止符。若输入超过100字节,fgets会截断且temp中无换行符,此时strlen(temp)为100,触发超长提示是正常逻辑。若输入小于50字节却提示超标,调试输出会直接暴露问题根源。
额外说明
你的汇编反转逻辑本身无问题,因为验证步骤在汇编执行前完成,不会影响长度判断结果。
内容的提问来源于stack exchange,提问作者Joni
相关产品推荐
相关产品推荐

