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

C语言传入的字符数组在for循环中异常变更,引发逻辑错误

括号验证代码的字符异常问题分析

问题描述

编写了用于验证括号有效性的C语言代码,传入字符串)(时,函数错误返回true并输出“字符串有效”。误以为传入的字符数组内容被修改——原字符串第一个字符是),但循环中打印出(`,疑惑原因。

代码示例

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

bool isValid(char* s) {
    int size = strlen(s);
    char array[] = {'(', ')', '[', ']', '{', '}'};
    
    printf("%c",*s); //此处输出 )
    printf("%c\n",*(s + 1)); //此处输出 (

    for (int i = 0; i < size; i++) { 
        if ((*(s + i)==array[0]) && (*(s + size - i - 1)==array[1])){
                printf("%c",*(s + i)); //此处输出 (
                printf("%c\n", *(s + size - i - 1)); //此处输出 )
                printf("%c\n", array[0]); //此处输出 (
            return true;    
        }
    }

    return false;
}

int main() {
    char str[] = ")(";

    if (isValid(str)) {
        printf("The string is valid\n"); //该行被执行
    } else {
        printf("The string is not valid\n");
    }

    return 0;
}

原因解释

你的字符数组并未被修改,问题源于代码逻辑错误和对循环执行流程的误解:

  1. 循环执行流程说明:

    • 传入的字符串)(长度为2,循环会执行两次(i=0和i=1`)。
    • i=0时,判断s[0]())是否等于array[0]((),条件不成立,跳过分支。
    • i=1时,判断s[1](()等于array[0]((),同时s[0]())等于array[1]()),条件成立,进入if分支。
    • 此时打印的*(s+i)是s[1](原字符串的第二个字符(),*(s + size -i -1)是s[0](原字符串的第一个字符)),你误以为是第一个字符被修改,实际只是访问了不同的数组下标。
  2. 核心逻辑错误:
    括号有效性的判断需要满足左括号与后续对应的右括号正确嵌套,而你的代码仅检查是否存在某一对对称位置的括号匹配就返回true,这种逻辑完全错误,会误判)(`这类无效字符串。

正确实现思路

验证括号有效性的标准方法是使用栈:

  • 遍历字符串,遇到左括号则入栈;
  • 遇到右括号时,检查栈顶是否为对应的左括号:是则出栈,否则返回false;
  • 遍历结束后,若栈为空则字符串有效,否则无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:17:10