扫描字符串中是否出现c中的字符

时间:2012-07-30 14:38:38

标签: c string

我在C ++或C#中找到了几个答案,但C没有。

我需要知道如何计算字符串中的字符数。目标是确定字符串中是否存在闭合块(由大括号'{''}'限制)。现在我有以下内容:

int closedBlock(char* value) {
    int open = 0;

    int i;
    for (i = 0; i < strlen(value); i++) {
        if (!strcmp("{", value[i])) {
            open++;
        } else if (!strcmp("}", value[i])) {
            open--;
        }
    }

    return !open;
}

但在第一次if检查后崩溃了。我不清楚为什么这不起作用。我想它与坏指针有关(这似乎总是C中的问题),但我无法弄明白。除了工作代码,并解释为什么我的坏是非常有帮助。

感谢。

注意

我知道这只是检查'{'的数量是否等于'}'的数量,而不是确实存在正确关闭的块。解决这个问题后,我会解决这个问题。

3 个答案:

答案 0 :(得分:6)

strcmp将比较两个以null结尾的字符串。令我感到困惑的是,你的编译器实际上并没有嘀咕第二个参数是char。如果要比较单个字符,只需使用等号运算符==

int closedBlock(char* value) {
    int open = 0;
    int length = strlen(value);
    int i;
    for (i = 0; i < length; i++) {
        if (value[i] == '{') {
            open++;
        } else if (value[i] == '}') {
            open--;
        }
    }

    return !open;
}

提示:如果您使用gcc-Wall -Wextra添加到编译器调用中,则通常会产生有用的警告。

  

我知道这只是检查“{”的数量是否等于“}”的数量,而不是确实存在一个正确关闭的块。解决这个问题后,我会解决这个问题。

这里有另一个提示:什么时候会出现无效的阻止?当且仅当结束标记}没有前面的开始标记{时。你已经拥有了所有这些工具,你只是错过了另一个if - 声明。

答案 1 :(得分:2)

这是因为您尝试将字符串"{"与单个字符进行比较:value[i]

value(大概)指向一个字符数组,而value[i]指定其中一个字符。所以你想比较字符到字符:

for (i = 0; i < strlen(value); i++) {
    if (value[i] == '{') {
        open++;
    } else if (value[i] == '}') {
        open--;
    }
}

请注意{}周围使用单个引号。这告诉编译器它是单个字符而不是C字符串。

答案 2 :(得分:0)

如果只比较一个字符,为什么要使用strcmp()

您只需使用==运算符,请参阅我的示例:

http://ideone.com/dNCH2

最好的问候肯尼