1

我在 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 中的问题),但我无法弄清楚。除了工作代码之外,解释为什么我的代码不好也会很有帮助。

谢谢。

笔记

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

4

3 回答 3

6

strcmp将比较两个以 null 结尾的字符串。让我感到困惑的是,您的编译器实际上并没有抱怨第二个参数是 a 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;
}

提示:如果你使用gccadd-Wall -Wextra到你的编译器调用,它通常会导致有用的警告。

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

这里的另一个提示:什么时候可以有一个无效的块?当且仅当 end-token}出现时没有前面的 start-token {。你已经拥有了所有的工具,你只是缺少另一个if-语句。

于 2012-07-30T14:41:41.353 回答
2

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

value(大概)指向一个字符数组,同时value[i]指定一个字符。所以你想像这样比较字符到字符:

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

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

于 2012-07-30T14:43:21.883 回答
0

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

您可以简单地使用==运算符查看我的示例:

http://ideone.com/dNCH2

最好的问候肯尼

于 2012-07-30T14:56:40.797 回答