鱼C论坛

 找回密码
 立即注册
查看: 2271|回复: 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-5 17:14:56 | 显示全部楼层
这个应该和最后的输出语句有关
printf("比较的结果是:%d\n", str1[i-1] - str2[i-1]);
你想为啥这句要用一个str1[i-1] - str2[i-1]而不是用str1[i] - str2[i]?
原因在于如果两个字符串是一样的,说明for语句中的i是的等于n的
for(i = 0; i < n; i++)
        {
                if(str1[i] - str2[i]) //只要str1[i] - str2[i]差不为0都为真
                {
                        i++; 
                        break;
                }
        }
举个具体例子,比如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]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

        printf("请输入比较的字符数:")                                                            ;
        scanf("%d" , & n)                                                                         ;
        if(n > 0) printf("比较的结果是:%d\n", cmpnstr(str1 , str2 , n))                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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