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; }
原因解释
你的字符数组并未被修改,问题源于代码逻辑错误和对循环执行流程的误解:
循环执行流程说明:
- 传入的字符串
)(长度为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](原字符串的第一个字符)),你误以为是第一个字符被修改,实际只是访问了不同的数组下标。
- 传入的字符串
核心逻辑错误:
括号有效性的判断需要满足左括号与后续对应的右括号正确嵌套,而你的代码仅检查是否存在某一对对称位置的括号匹配就返回true,这种逻辑完全错误,会误判)(`这类无效字符串。
正确实现思路
验证括号有效性的标准方法是使用栈:
- 遍历字符串,遇到左括号则入栈;
- 遇到右括号时,检查栈顶是否为对应的左括号:是则出栈,否则返回
false; - 遍历结束后,若栈为空则字符串有效,否则无效。
内容的提问来源于stack exchange,提问作者Gagan Batra
相关产品推荐
相关产品推荐

