提问人:elo melo 提问时间:12/19/2022 更新时间:12/19/2022 访问量:87
c 中的字符串比较
String comparison in c
问:
#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 个字符。我已经限制了它。有解决办法吗?
答:
2赞
Sandeep Sahani
12/19/2022
#1
您在程序中犯了以下错误:
- 未分配空间(编译时会抛出错误)。
char strg1[];
错误:定义具有数组类型的变量需要显式大小或初始值设定项 字符 strg1[];
- 用于读取字符串,这可能导致 .
使用时,编译器应该警告您。
gets()
Buffer Overflow
gets()
警告:此程序使用 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
使用在不提供长度限制的情况下读取字符串并不比使用 更好。scanf
gets
0赞
Support Ukraine
12/19/2022
除了和 一样糟糕之外,它的作用也不尽相同。最好的替代方法是 。但请记住,这与将换行符保存在目标缓冲区中不同。scanf("%s"...
gets
gets
gets
fgets
fgets
gets
1赞
Support Ukraine
12/19/2022
如果您仍然想使用,请确保这样做:因为尺寸为 100scanf
scanf("%99s",strg1);
strg1
0赞
Sandeep Sahani
12/19/2022
@Gerhardh 是的,你是对的。为了删除警告,您可以使用scanf()
0赞
Gerhardh
12/19/2022
好吧,我们的目标不应该是消除警告,而是解决警告的问题。
评论
gets()
strg1
char strg1[];
无效 C。这是您的真正问题 - 您的编译器配置不正确。对于学习 C 的初学者,推荐哪些编译器选项?scanf("%s", strg1);
gets(strg1);