在C语言中,如何正确地比较字符串?

251

我正在尝试编写一个程序,让用户输入一个单词或字符,存储它,然后打印出来,直到用户再次输入相同的内容,退出程序。我的代码如下:

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i = 0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);   /* obsolete function: do not use!! */
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check);   /* obsolete function: do not use!! */
    }

    printf("Good bye!");
    
    return 0;
}

问题是,即使用户输入(check)与原始输入(input)匹配,我仍然不断打印输入字符串。我是否比较这两个值的方式有误?

17
gets( )已经从标准中移除,请改用fgets( )。新函数可以实现同样的功能,但更安全可靠。 - lost_in_the_source
1
请注意,这个答案解释了如何比较字符串的相等性、不相等性、小于、大于、小于或等于以及大于或等于。并非所有的字符串比较都是为了相等性。大小写敏感的比较又是另一回事;其他特殊比较(例如字典顺序)需要更专业的比较器,而复杂的正则表达式则可以用于更复杂的比较。 - Jonathan Leffler
还要注意,此外还有一个基本上重复的问题如何检查值是否与字符串匹配,这个问题是在几年前提出的。 - Jonathan Leffler
这个回答解决了你的问题吗?如何检查一个值是否匹配一个字符串 - Andreas
3
这个问题很好,但使用gets()是不可取的。自C11标准以来,它也已被删除 -> 请阅读为什么gets()函数如此危险,不应该使用? - RobertS supports Monica Cellio
11个回答

-2
我刚开始编码并开始在YouTube上观看CS50视频。在那里,我遇到了一个问题,即您无法使用“==”比较两个字符串。因此,我尝试了一下:
#include <iostream>

using namespace std;

int main()
{

   string str[] = {"tom", "chris"};

   if (str[0] == "tom")
   {
       return 0;
   }

return 1;
}

由于某种原因,该程序运行并返回0。但是视频和这里的帖子说得不一样。

4
这个程序之所以能够工作,是因为数组的第一个元素和比较中的字符串字面值"tom"恰好是相同的全局空字符终止的char数组。这种情况非常普遍,但并不被C标准保证。此外,这种比较对于其他任何字符串都不起作用。不要依赖这种巧合,而应该使用strcmp()函数。 - chqrlie

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