自行编写一个strcmp函数,不能直接调用

自行编写一个strcmp函数,不能直接调用。

#include<stdio.h>
int strcmp(char *str1,char *str2)
{
    if(str1==NULL||str2==NULL)
    {
        return -2;
    }
    int r=0;
    while(!(r=*str1-*str2)&&*str1&&*str2)//当*str1和*str2相等时,指针往后移,当str1和str1不相等,或者str1或str2移动到‘/0’时结束循环
    {
        str1++;
        str2++;
    }
    if(*str1>*str2)
    {
        r = 1;
    }
    if(*str1<*str2)
    {
        r= -1;
    }
    return r;
}
int main(){
    char str1[50],str2[50];
    printf("请输入两个字符串:\n");
    scanf_s("%s",str1);
    scanf_s("%s",str2);
    printf("%d",strcmp(str1,str2));
    return 0;
}

我的输出结果一直都是1,程序该怎么修改呢

使用scanf_s函数时,没有指定字符串的最大长度

#include<stdio.h>
int strcmp(char *str1,char *str2)
{
    if(str1==NULL||str2==NULL)
    {
        return -2;
    }
    int r=0;
    while(!(r=*str1-*str2)&&*str1&&*str2)//当*str1和*str2相等时,指针往后移,当str1和str1不相等,或者str1或str2移动到‘/0’时结束循环
    {
        str1++;
        str2++;
    }
    if(*str1>*str2)
    {
        r = 1;
    }
    if(*str1<*str2)
    {
        r= -1;
    }
    return r;
}
int main(){
    char str1[50],str2[50];
    printf("请输入两个字符串:\n");
    if(scanf_s("%49s",str1) != 1 || scanf_s("%49s",str2) != 1)
    {
        printf("输入错误\n");
        return -1;
    }
    printf("%d",strcmp(str1,str2));
    return 0;
}


好像没有什么问题,是不是你的函数和系统提供的strcmp函数重名了?可以换一下你的strcmp函数的名字,比如在前面加一个"_"变成_strcmp

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7738782
  • 这篇博客你也可以参考下:自己写一个strcmp函数
  • 你还可以看下c语言参考手册中的 比较两个字符串-strcmp
  • 除此之外, 这篇博客: C语言:模拟实现strcmp函数的功能中的 模拟实现strcmp函数的功能 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 函数原型: int strcmp(const char *s1,const char * s2)

    所在头文件:string.h

    函数功能:用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

    模拟实现

    #include <stdio.h>
    #include<assert.h>
    #include<Windows.h>
    int my_strcmp( char* str1, char* str2)
    {
    	assert(str1);
    	assert(str2);
    	while (*str1 == *str2)
    	{
    		if (*str1 == '\0'||( *str2='\0'))
    			return 0;
    		str1++;
    		str2++;
    	}
    	return *str1 - *str2;
    }
    
    int main()
    {
    	char str[32] = "bcdefgh";
    	char buf[32] = "bcdefgh";
    	char erc[32] = "abcdefg";
    	char std[32] = "cdefghi";
    	printf("%d\n", my_strcmp(str, buf));
    	printf("%d\n", my_strcmp(str, erc));
    	printf("%d\n", my_strcmp(str, std));
    	system("pause");
    	return 0;
    }
    
    

    运行截图

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中给出的模拟实现strcmp函数的代码,可以看出strcmp函数的比较规则是先逐个比较两个字符串中的字符,如果有不同的字符出现,则返回这个字符的差值;如果两个字符串完全相同,则返回0。根据这个规则,可以尝试修改自己编写的strcmp函数。

    int my_strcmp(const char* value1_char, const char* value2_char) {
        assert(value1_char != nullptr && value2_char != nullptr); // 首先判断输入的字符串是否为空指针
        while (*value1_char != '\0' && *value2_char != '\0') {
            if (*value1_char != *value2_char) { // 如果两个字符不相等,则返回两个字符的差值
                return *value1_char - *value2_char;
            }
            value1_char++; // 继续比较下一个字符
            value2_char++;
        }
        return *value1_char - *value2_char; // 如果两个字符串有一个已经到达了'\0'字符,则返回两个字符串长度的差值
    }
    

    这个修改后的函数会先判断输入的两个字符串是否为空指针,然后利用while循环逐个比较两个字符串中的字符,如果有不同的字符出现,则返回这个字符的差值;如果两个字符串有一个已经到达了'\0'字符,则返回两个字符串长度的差值。注意在比较过程中,要先判断字符是否为'\0',然后再进行比较,以确保正确处理字符串的结束符问题。

    希望这个修改后的函数能够解决你的问题。如果还有其他问题,请随时提问。