自行编写一个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
函数原型: 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;
}
运行截图
根据参考资料中给出的模拟实现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',然后再进行比较,以确保正确处理字符串的结束符问题。
希望这个修改后的函数能够解决你的问题。如果还有其他问题,请随时提问。