我在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中的问题),但我无法弄明白。除了工作代码,并解释为什么我的坏是非常有帮助。
感谢。
注意
我知道这只是检查'{'
的数量是否等于'}'
的数量,而不是确实存在正确关闭的块。解决这个问题后,我会解决这个问题。
答案 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)