c# 为什么我使用Strcmp时没有得到输出?

0qx6xfy6  于 2023-01-22  发布在  C#
关注(0)|答案(2)|浏览(168)

使用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所做的一切。

zvms9eto

zvms9eto1#

这个问题与strcmp的使用无关,您在使用scanf()读取字符串的方式中存在未定义的行为。您将字符串指针的地址传递到scanf()预期char数组地址的位置。
在这两种情况下,行为都是未定义的,第一个程序确实导致了分段错误,而第二个程序似乎产生了预期的行为,这只是偶然的,因为输入的字符串很短。尝试更长的字符串,你也可能得到分段错误。
以下是定义了行为的修改版本:

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

int main(void) {
    char i[100], j[100];
    
    if (scanf("%99s %99s", i, j) == 2) {
        if (strcmp(i, j) == 0) {
            printf("Same\n");
        } else {
            printf("Different\n");
        }
    }
    return 0;
}

注意%99s如何告诉scanf()最多将99个字节存储到目标数组中以避免缓冲区溢出。
还要注意必须如何测试scanf返回值,以避免访问未初始化的数据(它返回成功转换的次数,对于ij,该值必须为2,才能包含有效的C字符串)。

tjjdgumg

tjjdgumg2#

当你使用strcmp时,你不会得到任何输出,因为strcmp比较的是两个字符串的内存地址,而不是字符串本身;当你使用i == j时,你直接比较的是两个字符串的内存地址,这就是为什么你得到的输出是“Same”。
要使用strcmp正确地比较两个字符串,需要将这两个字符串作为参数传递,如下所示:

if (strcmp(i, j) == 0) {
    printf("Same \n");
} else {
    printf("different\n");
}

此外,在C中,应使用%s通过scanf()函数而不是&读取字符串。

scanf("%s %s", i, j);

另外,在C语言中,你应该使用字符数组而不是指针来存储字符串,并在将字符串存储到字符串中之前为它们分配内存。

char i[100], j[100];
scanf("%s %s", i, j);

这将比较两个字符串的内容,您应该得到正确的输出。

相关问题