c 中的字符串比较

String comparison in c

提问人:elo melo 提问时间:12/19/2022 更新时间:12/19/2022 访问量:87

问:

#include<stdio.h>
#include<string.h>

int main()
{
    char strg1[];
    char strg2[] = "football"



    printf("Enter first string: ");
    gets(strg1);

    

    if(strcmp(strg1, strg2)==0)
    {
        printf("\nEqual");
    }

    else
    {
        printf("\nNot Equal");
    }

   
    return 0;
}

我从用户那里得到一个字符串作为输入,我想将它与我拥有的现成字符串进行比较,无论它是否相等。当我尝试使用 strcmp 时,它们并不相等。例如,当我尝试使用 strncmp 时,用户 footballABC 写道我的字符串 football 仍然相等,因为使用 strncmp 它是 8 个字符。我已经限制了它。有解决办法吗?

C 字符串 字符 比较

评论

5赞 Jonathan Leffler 12/19/2022
永远不要使用。gets()
6赞 Jonathan Leffler 12/19/2022
您尚未为 分配任何空间。不会有什么好事发生。(我很惊讶它完全编译了。现代编译器肯定会发出有关它的警告。strg1
2赞 Retired Ninja 12/19/2022
为什么 gets 函数如此危险以至于不应该使用它?
0赞 Lundin 12/19/2022
char strg1[];无效 C。这是您的真正问题 - 您的编译器配置不正确。对于学习 C 的初学者,推荐哪些编译器选项?
0赞 Zakk 12/19/2022
并且与 .完全没有区别。scanf("%s", strg1);gets(strg1);

答:

2赞 Sandeep Sahani 12/19/2022 #1

您在程序中犯了以下错误:

  1. 未分配空间(编译时会抛出错误)。char strg1[];

错误:定义具有数组类型的变量需要显式大小或初始值设定项 字符 strg1[];

  1. 用于读取字符串,这可能导致 . 使用时,编译器应该警告您。gets()Buffer Overflowgets()

警告:此程序使用 gets(),这是不安全的。
全文 为什么gets()不安全。

更正的程序:

#include<stdio.h>
#include<string.h>

int main()
{
    // char strg1[]; // Error!
    char strg1[100]; // Allocate space to Array.
    char strg2[] = "football";

    printf("Enter first string: ");
    scanf("%s",strg1); // Use Scanf() instead of gets().

    if(strcmp(strg1, strg2)==0)
    {
        printf("\nEqual");
    }

    else
    {
        printf("\nNot Equal");
    }

    return 0;
}

评论

1赞 Gerhardh 12/19/2022
使用在不提供长度限制的情况下读取字符串并不比使用 更好。scanfgets
0赞 Support Ukraine 12/19/2022
除了和 一样糟糕之外,它的作用也不尽相同。最好的替代方法是 。但请记住,这与将换行符保存在目标缓冲区中不同。scanf("%s"...getsgetsgetsfgetsfgetsgets
1赞 Support Ukraine 12/19/2022
如果您仍然想使用,请确保这样做:因为尺寸为 100scanfscanf("%99s",strg1);strg1
0赞 Sandeep Sahani 12/19/2022
@Gerhardh 是的,你是对的。为了删除警告,您可以使用scanf()
0赞 Gerhardh 12/19/2022
好吧,我们的目标不应该是消除警告,而是解决警告的问题。