在一个字符串中比较一个字符与给定字符的区别

10

我有以下代码:

int findPar(char* str)
{
int counter=0;

while (*str) 
{
    if(str[0] == "(") <---- Warning
    {
        counter++;
    }
    else if (str[0]== ")") <---- Warning
    {
        counter--;
    }
    if (counter<0) 
    {
        return 0;
    }
    str++;
}

if (counter!=0) 
{
    return 0;
}
return 1;
}

我收到的警告是比较int和char类型。

我尝试使用strcmp进行比较(将字符串中的第一个字符与给定字符进行比较),代码如下:

    if (strcmp(str, ")")==0) { stuff }

即使比较是正确的,但它从未进入“stuff”,我该如何做?


1
使用单引号。")" == )\0 字面意思是右括号加空字符,而 ')' == ) - chris
strcmp(str, ')') == 0 不起作用,因为你正在将整个字符串char*与单个字面字符进行比较。如果你这样做 strcmp(str[0], ')') == 0 就能行。 - EdChum
@EdChum strcmp 函数期望其参数为字符串。')',一个值为 41 的字符将被转换为 (char*)41。因此该函数将查找内存地址 41,希望看到一个字符串,但实际上 - 糟糕!出现了段错误。 - Imp
@Imp 好的,我不确定,所以我在我的猜测上做了注释,谢谢你指出来。 - EdChum
4个回答

21
如果str是C字符串(以空字符结尾的char数组),那么str[0]是一个char。
请注意,引号的类型很重要!')' 是一个char,而 ")"是一个字符串(即由')'字符和一个空终止符组成的字符串)。
因此,您可以比较两个字符:
str[0] == ')'

或者您可以比较两个字符串

strcmp(str, ")") == 0

自然地,(如果str字符串确实只包含那个括号,则第二个方法有效)。


7

您正在比较一个字符 (str[0]) 和一个 const char[N] ("whatever")。您需要使用单引号,因为双引号表示字符数组,而单引号表示单个字符:

if (str[0] == ')') // or *str == ')'

等等。

strcmp 失败的原因是,虽然有时字符串确实指向 ),但它后面还有更多字符(即没有紧跟着一个 '\0'),所以该字符串与只有一个字符的字符串 ")" 不等价。


2

双引号"是字符串定界符,所以")"是指向if(str[0] == "(")中字符串字面量的指针。 你想要比较一个字符,因此必须使用单引号。

if(str[0] == '(')

1

您需要使用if (str[0] == ')')等语句。请注意单引号(撇号)用于表示字符字面量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接