在C语言中比较字符

3

我想询问在C语言的函数中如何比较字符串中的单个字符。 代码如下:

int fq(char *s1){
int i;
for(i=0;i<strlen(s1);i++){
    if(s1[i]=="?"){
        printf("yes");
    }
}
return 1;
}

即使s1="???",它也永远不会输出yes。我已经解决了这个问题,但我很好奇为什么一种方法有效而另一种方法无效。 下面是有效的代码:
int fq(char *s1,char *s2){
int i;
char q[]="?";
for(i=0;i<strlen(s1);i++){
    if(s1[i]==q[0]){
        printf("yes");
    }
}
return 1;
}

你能发布数组s1的声明吗? - Javia1492
这个 for(i=0;i<strlen(s1);i++) 很糟糕,因为你在每次迭代中都要遍历整个字符串,这个 for (i = 0 ; s1[i] != '\0' ; ++i) 会好得多。此外,只需要做 if (s1[i] == 'q') 就足够了,而问题必须出在你初始化 s1 的地方。 - Iharob Al Asimi
@iharob:为什么要遍历整个字符串?strlen()返回字符串的大小,因此技术上他的for循环将运行他的字符串长度的大小。 - Javia1492
1
@Javia1492 是的,这是原则。实际上,每次调用 strlen 时,它也会迭代字符串以查找 \0。除非优化级别足够高,并且您使用 const 告诉编译器字符串不会改变。 - Mr Lister
@MrLister 我明白你的意思。换句话说,每次评估 for 循环条件时,它都会重新计算字符串的 strlen。是这样吗? - Javia1492
@Javia1492 没错。 - Mr Lister
4个回答

5

因为第一个样本比较的是地址而不是字符。

C语言中没有字符串类型,当==运算符应用于数组或指针时,它会比较地址而不是内容。

您的函数应该写成这样才正确:

int fq(char *s1,char *s2)
{
    int i;
    for (i = 0 ; s1[i] ; ++i)
    {
        if (s1[i] == 'q')
            printf("yes");
    }

    return 1;
}

您可以将s1 [i] 'q'进行比较。


我不确定你在这句话中想要表达什么意思:“C语言中没有字符串类型,当应用于数组或指针时,==运算符比较的是地址而不是内容。” ==是一个有效的C运算符。请参考参考资料 - Javia1492
我并不是说==操作符无效,只是一些使用C++、Python或任何带有字符串类型的编程语言的程序员习惯于使用==操作符来比较字符串,这在这些语言中当然是有效的。但在C语言中,你不能使用该操作符来比较字符串。 - Iharob Al Asimi
嗯,我已经很久没有用C语言编程了(而且那时候是嵌入式C),所以我不确定你为什么这么说,但还是谢谢你澄清。我不知道C语言中没有包含字符串类型。 - Javia1492
严谨地说,“比较地址而不是字符”的短语是不正确的。您需要将字符s1[1]的值与字符串“?”的地址进行比较。 - Mr Lister

4

"?" 不是 char 类型,而是只包含一个字符的字符串。

'?' 是一个 char 类型,在 s1[i] == '?' 中应该返回 true。


1
if(s1[i]=="?"){

使用 s1[i] 是否为字符 '?' 的语法不正确。应该使用以下语法:

if(s1[i] == '?'){

你可能希望调查如何更改编译器设置,以便在代码库中存在这样的表达式时获得警告。 使用选项-Wallgcc,我得到以下消息:
cc -Wall    soc.c   -o soc
soc.c: In function ‘fq’:
soc.c:7:15: warning: comparison between pointer and integer
       if(s1[i]=="?"){
               ^
soc.c:7:15: warning: comparison with string literal results in unspecified behavior [-Waddress]

0

在C语言中,字符数组即字符串的语法为“”。对于单个字符,语法为''。

在您的情况下,应该是:if(s1[i]=='?')

如果您想以字符串形式进行比较,则需要使用strcmp。因为'=='运算符不能在C语言中比较字符串。

要比较两个字符串,我们可以使用:if(!strcmp(s1,q))

并且对于此操作,您需要添加string.h头文件,如:#include <string.h>

要使用“==”运算符比较字符串,您需要重载运算符。但是,C语言不支持运算符重载。为此,您可以使用C++语言。


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