鱼C论坛

 找回密码
 立即注册
查看: 2710|回复: 4

[已解决]比较字符串函数问题,萌新求教

[复制链接]
发表于 2023-2-10 23:54:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int check (char s1[],char s2[])
{
        int i,l;
    for(i=0;i<=19;i++)
        if(s1[i]!=s2[i])                                    
            break;
    if(s1[i]>s2[i])
        l=1;
    else if(s1[i]==s2[i])
        l=0;
    else
        l=-1;
    printf("\n");
    return l;
}
int main()
{
    char str1[20];
    char str2[20];
    gets(str1);
    gets(str2);
    printf("%d",check(str1,str2));
}

为何我输入相同字符串,结果显示为1,为什么不是0?而且似乎得不到为0的结果。
最佳答案
2023-2-11 17:44:01
本帖最后由 傻眼貓咪 于 2023-2-11 17:45 编辑

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>

  3. int check(char s1[], char s2[])
  4. {
  5.     // int i, l; <------- 不需要这行
  6.     for (int i = 0; i <= 19 && s1[i] && s2[i]; i++) { // <------- 这里稍微作修改
  7.         if (s1[i] != s2[i])
  8.             return s1[i] - s2[i]; // <------- 这里稍微作修改
  9.         if (!s2[i] && s1[i]) return -1;
  10.         else if (!s1[i] && s2[i]) return 1;


  11.         /* ----------------------------------------------------------
  12.         if (s1[i] > s2[i]) <------ 上面已经修改,这里不需要这行
  13.             l = 1;
  14.         else if (s1[i] == s2[i]) <------ 直接在最下面返回就可以了
  15.             l = 0;
  16.         else
  17.             l = -1; <------ 上面已经修改,这里不需要这行
  18.         ---------------------------------------------------------- */

  19.     }
  20.       
  21.     // printf("\n"); <------- 不需要这行
  22.     return 0; // <------- 这里稍微作修改
  23. }
  24. int main()
  25. {
  26.     char str1[20];
  27.     char str2[20];
  28.     gets(str1);
  29.     gets(str2);
  30.     printf("%d", check(str1, str2));
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 08:18:30 | 显示全部楼层

你写的程序并没有判断到\0结束,所以字符串结束后还会继续往后判断,
数组未初始化,在两个数组中,你输入的字符串后边是啥你不知道。
解决方法:
char str1[20]={0};
char str2[20]=={0};
给数组初始化,确保在你输入的字符串后边都是相同的。
但即使这样你的程序如果输入超过20个字符的字符串还是会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-11 08:21:18 | 显示全部楼层
本帖最后由 jhq999 于 2023-2-11 08:22 编辑
  1. for(i=0;i<=19;i++)
  2.         if(s1[i]!=s2[i])  //本来就是不等于退出,除非字符串长度大于19 ,还有你这个bug太多,了解下字符串结束标志                                 
  3.             break;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 17:44:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2023-2-11 17:45 编辑

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>

  3. int check(char s1[], char s2[])
  4. {
  5.     // int i, l; <------- 不需要这行
  6.     for (int i = 0; i <= 19 && s1[i] && s2[i]; i++) { // <------- 这里稍微作修改
  7.         if (s1[i] != s2[i])
  8.             return s1[i] - s2[i]; // <------- 这里稍微作修改
  9.         if (!s2[i] && s1[i]) return -1;
  10.         else if (!s1[i] && s2[i]) return 1;


  11.         /* ----------------------------------------------------------
  12.         if (s1[i] > s2[i]) <------ 上面已经修改,这里不需要这行
  13.             l = 1;
  14.         else if (s1[i] == s2[i]) <------ 直接在最下面返回就可以了
  15.             l = 0;
  16.         else
  17.             l = -1; <------ 上面已经修改,这里不需要这行
  18.         ---------------------------------------------------------- */

  19.     }
  20.       
  21.     // printf("\n"); <------- 不需要这行
  22.     return 0; // <------- 这里稍微作修改
  23. }
  24. int main()
  25. {
  26.     char str1[20];
  27.     char str2[20];
  28.     gets(str1);
  29.     gets(str2);
  30.     printf("%d", check(str1, str2));
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 17:51:44 | 显示全部楼层
本帖最后由 ExiaGN001 于 2023-2-13 17:58 编辑

这是简化版strcmp?
建议先BDFS一下野指针相关知识,以明确在程序中野指针/未初始化数据的危险性。
这么改:
  1. #include <stdio.h>
  2. int strlen(char s)//功能同string.h里的同名函数
  3. {
  4.         int cnt=0;
  5.         while(s[cnt]!='\0')cnt++;
  6.         return cnt;
  7. }
  8. int min(int a,int b)//功能同math.h里同名函数
  9. {
  10.         return a<b?a:b;
  11. }

  12. int check (char s1[],char s2[])
  13. {
  14.         int i,l;
  15.     for(i=0;i<min(strlen(s1),strlen(s2));i++)
  16.         if(s1[i]!=s2[i])                                    
  17.             break;
  18.     if(s1[i]>s2[i])
  19.         l=1;
  20.     else if(s1[i]==s2[i])
  21.         l=0;
  22.     else
  23.         l=-1;
  24.     //printf("\n");
  25.     return l;
  26. }
  27. int main()
  28. {
  29.     char str1[20];
  30.     char str2[20];
  31.     gets(str1);
  32.     gets(str2);
  33.     printf("%d",check(str1,str2));
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 21:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表