出于某种原因,取消注释最后一行会导致分段错误。我不知道为什么会发生这种情况,因为它只是创建一个新的字符串。 代码是:
char str[] = "()";
if (isBalanced(str))
printf("%s is balanced\n", str);
else printf("%s is not balanced\n", str);
char str1[] = "((1()";
if (isBalanced(str1))
printf("%s is balanced\n", str1);
else printf("%s is not balanced\n", str1);
//char str2[] = "((1){()})";
没有错误,程序按预期运行,但是一旦取消注释最后一行,就会在任何打印语句打印之前发生分段错误。
我发现将str2 []更改为hi []可以解决问题,但为什么会这样呢? stdio.h没有定义任何干扰这里的宏,而str2不是C中的关键字。如果我忽略了一些愚蠢的东西,请告诉我。
这是完整的程序。
#include <stdio.h>
int isBalanced(char *str) {
int x = 0;
int length;
while (str[x++] != '\0') length++;
char open[50];
unsigned int numOpen = 0;
for (x = 0; x < length; x++) {
if (str[x] == '{')
open[numOpen++] = str[x];
if (str[x] == '(')
open[numOpen++] = str[x];
if (str[x] == '[')
open[numOpen++] = str[x];
if (str[x] == '}') {
if (open[numOpen-1] != '{')
return 0;
else numOpen--;
}
if (str[x] == ')') {
if (open[numOpen-1] != '(')
return 0;
else numOpen--;
}
if (str[x] == ']') {
if (open[numOpen-1] != '[')
return 0;
else numOpen--;
}
}
return numOpen == 0;
}
int main() {
char str[] = "()";
if (isBalanced(str))
printf("%s is balanced\n", str);
else printf("%s is not balanced\n", str);
char str1[] = "((1()";
if (isBalanced(str1))
printf("%s is balanced\n", str1);
else printf("%s is not balanced\n", str1);
char str2[] = "((1){()})";
//if (isBalanced(str1))
// printf("%s is balanced\n", string);
//else printf("%s is not balanced\n", string);
}
提前致谢。
答案 0 :(得分:4)
如果我忽视了一些愚蠢的事情,请告诉我。
是的,你是。您正在使用未初始化的变量。这导致了不确定的行为。改变
int length;
到
int length = 0;
isBalanced
中的。