使用strcmp
时:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *i, *j;
scanf("%s %s", &i, &j);
if (strcmp(i, j) == 0){
printf("Same \n");
} else {
printf("different\n");
}
}
output:不输出,只显示空白
当我直接比较i和j
#include <stdio.h>
#include <string.h>
int main(void)
{
char *i, *j;
scanf("%s %s", &i, &j);
if (i == j) {
printf("Same \n");
} else {
printf("different\n");
}
}
输出:Same
是的,这就是我用strcmp()
替换i == j
所做的一切。
2条答案
按热度按时间zvms9eto1#
这个问题与
strcmp
的使用无关,您在使用scanf()
读取字符串的方式中存在未定义的行为。您将字符串指针的地址传递到scanf()
预期char
数组地址的位置。在这两种情况下,行为都是未定义的,第一个程序确实导致了分段错误,而第二个程序似乎产生了预期的行为,这只是偶然的,因为输入的字符串很短。尝试更长的字符串,你也可能得到分段错误。
以下是定义了行为的修改版本:
注意
%99s
如何告诉scanf()
最多将99个字节存储到目标数组中以避免缓冲区溢出。还要注意必须如何测试
scanf
返回值,以避免访问未初始化的数据(它返回成功转换的次数,对于i
和j
,该值必须为2
,才能包含有效的C字符串)。tjjdgumg2#
当你使用strcmp时,你不会得到任何输出,因为strcmp比较的是两个字符串的内存地址,而不是字符串本身;当你使用i == j时,你直接比较的是两个字符串的内存地址,这就是为什么你得到的输出是“Same”。
要使用strcmp正确地比较两个字符串,需要将这两个字符串作为参数传递,如下所示:
此外,在C中,应使用%s通过scanf()函数而不是&读取字符串。
另外,在C语言中,你应该使用字符数组而不是指针来存储字符串,并在将字符串存储到字符串中之前为它们分配内存。
这将比较两个字符串的内容,您应该得到正确的输出。