C语言字符串校验程序异常:检测非法字符后仍继续执行
问题:字符串校验后程序未按预期终止执行
以下是用于字符串校验的C语言代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> const char *myarg1 = NULL; const char *myarg2 = NULL; int checkString(char str1[]) { int i, x=0, p; p=strlen(str1); for (i = 0; i < p ; i++) { if ((str1[i] == '(' && str1[i] <= ')') || (str1[i] >= '!')) { continue; } else{ return 0; } } printf("Invalid char detected in password\n"); return 1; } int main( int argc, const char **argv) { myarg1 = argv[1]; myarg2 = argv[2]; if (argc <= 2) { printf ("usage: %s <string> <encrypt_key>\n", argv[0]); return 0; } checkString(myarg1); puts("Just a test message"); }
当传入参数'Xena(.)!(.)'运行程序时,预期输出"Invalid char detected in password"并终止程序,但目前即使输出了错误信息,程序仍会继续执行puts("Just a test message"),请问如何解决该问题?
解决方案
1. 修正checkString的逻辑错误
当前函数的判断逻辑和返回值完全颠倒,且存在条件判断漏洞:
- 原条件
(str1[i] == '(' && str1[i] <= ')')只能匹配'('字符,无法匹配')',需改为(str1[i] >= '(' && str1[i] <= ')')才能覆盖()两个字符。 - 原逻辑是"符合条件则跳过,不符合返回0;循环结束后输出错误返回1",完全搞反了校验成功/失败的判断逻辑。正确逻辑应为:遇到非法字符立即输出错误并返回错误码,所有字符校验通过则返回成功标记。
修正后的checkString函数:
int checkString(const char *str1) { int p = strlen(str1); for (int i = 0; i < p ; i++) { // 允许的字符:! 到 ) 之间的可打印字符(包含边界) if (str1[i] >= '!' && str1[i] <= ')') { continue; } // 检测到非法字符,输出错误并返回非0错误码 printf("Invalid char detected in password\n"); return 1; } // 所有字符校验通过,返回0表示成功 return 0; }
2. 在main中处理校验结果
原代码仅调用checkString但完全忽略返回值,导致无论校验是否失败,程序都会继续执行后续代码。需要根据返回值决定是否终止程序:
修正后的main函数:
int main( int argc, const char **argv) { if (argc <= 2) { printf ("usage: %s <string> <encrypt_key>\n", argv[0]); return EXIT_FAILURE; } const char *myarg1 = argv[1]; const char *myarg2 = argv[2]; // 校验失败则立即终止程序 if (checkString(myarg1) != 0) { return EXIT_FAILURE; } puts("Just a test message"); return EXIT_SUCCESS; }
3. 额外优化点
- 将
checkString的参数改为const char*,符合C语言的const正确性原则(不修改输入字符串)。 - 使用标准宏
EXIT_SUCCESS/EXIT_FAILURE替代0和1,提升代码可读性与可移植性。 - 局部变量在使用时定义,贴合现代C语言编码习惯。
修改完成后,传入非法字符参数时,程序会输出错误信息并立即终止;只有所有字符校验通过时,才会执行后续的puts语句。
内容的提问来源于stack exchange,提问作者johnny bravo
相关产品推荐
相关产品推荐

