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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:57:49