鱼C论坛

 找回密码
 立即注册
查看: 2946|回复: 3

C语言 第19课字符串处理 模仿strncmp函数实现功能

[复制链接]
发表于 2022-3-5 16:37:17 | 显示全部楼层 |阅读模式

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

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

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

int main()
{
        char str1[1024];
        char str2[1024];
        int i = 0;///读取数组中的字符
        unsigned int n;///接受比较的字符数
               
        printf("请输入第一个字符串:");
        while((str1[i++] = getchar()) != '\n');

        printf("请输入第二个字符串:");
        i = 0;
        while((str2[i++] = getchar()) != '\n');

        printf("请输入比较的字符数:");
        scanf("%u", &n);

        for(i = 0; i < n; i++)
        {
                if(str1[i] - str2[i])
                {
                        i++; ///这里为什么要i++?我自己没写这个,所以错了,输不出来正确的答案!
                        break;
                }
        }

        printf("比较的结果是:%d\n", str1[i-1] - str2[i-1]);

        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-5 17:14:56 | 显示全部楼层
这个应该和最后的输出语句有关
  1. printf("比较的结果是:%d\n", str1[i-1] - str2[i-1]);
复制代码

你想为啥这句要用一个str1[i-1] - str2[i-1]而不是用str1[i] - str2[i]?
原因在于如果两个字符串是一样的,说明for语句中的i是的等于n的
  1. for(i = 0; i < n; i++)
  2.         {
  3.                 if(str1[i] - str2[i]) //只要str1[i] - str2[i]差不为0都为真
  4.                 {
  5.                         i++;
  6.                         break;
  7.                 }
  8.         }
复制代码

举个具体例子,比如str1 = “abcdf”, str2="abcdz",比较前4个字符
如果最后的输出不用str1[i-1] - str2[i-1],那结果就是 str1[4] - str2[4] 即 'f' - 'z',
这个样的话结果就会出错,正确的输出应该是 0 ,但实际输出是 -20
所以必须有个i++,因为要照顾到 str1[i-1] - str2[i-1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 17:15:56 | 显示全部楼层
  1. #include <stdio.h>

  2. int cmpnstr(char s1[] , char s2[] , int n)
  3. {
  4.         int i , r                                                                                 ;
  5.         for(r = i = 0 ; i < n && s[1] && s2[i] && s1[i] == s2[i] ; i ++)                          ;
  6.         if(i < n) r = s1[i] - s2[i]                                                               ; // 如果 i == n 说明 s1、s2 前 n 个字符完全相同 r = 0,i < n 则说明不相同,首个不同的字符的索引为 i
  7.         return r                                                                                  ;
  8. }

  9. int main(void)
  10. {
  11.         char str1[1024] , str2[1024] , c                                                          ;
  12.         int i , n                                                                                 ;
  13.         printf("请输入第一个字符串:")                                                            ;
  14.         for(i = 0 , str1[i] = '\0' ; (c = getchar()) != '\n' ; i ++ , str1[i] = '\0') str1[i] = c ;

  15.         printf("请输入第二个字符串:")                                                            ;
  16.         for(i = 0 , str2[i] = '\0' ; (c = getchar()) != '\n' ; i ++ , str2[i] = '\0') str2[i] = c ;

  17.         printf("请输入比较的字符数:")                                                            ;
  18.         scanf("%d" , & n)                                                                         ;
  19.         if(n > 0) printf("比较的结果是:%d\n", cmpnstr(str1 , str2 , n))                          ;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 17:17:33 | 显示全部楼层
  1. printf("比较的结果是:%d\n", str1[i] - str2[i]);//去掉i++,改成这样试试,不明白输出str1[i] - str2[i]有什么意义,谁能解释一下
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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