|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Khayal 于 2022-10-30 21:04 编辑
实现 strncmp 函数,允许用户指定前 n 个字符进行对比,这一次要求支持中英文混合的字符串比较噢!
我写的如下:
#include <stdio.h>
#define MAX 1024
int main()
{
char str1[MAX], str2[MAX];
char *target1 = str1, *target2 = str2;
int index = 1, n;
printf("Input the first string:");
fgets(str1, MAX, stdin);
printf("Input the secong string:");
fgets(str2, MAX, stdin);
printf("Input the number for comparing:");
scanf("%d", &n);
while (n && *target1 != '\0' && *target2 != '\0')
{
if (*target1++ != *target2++)
{
break;
}
index++;
n--;
}
if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
{
printf("The same!\n", index);
}
else
{
printf("Different in the %d char!\n", index);
}
return 0;
}
Q1:小甲鱼在while这里将中文的情况区分开来,即
- char ch;
- ……
- while (n && *target1 != '\0' && *target2 != '\0')
- {
- ch = *target1;
- if (ch < 0)
- {
- if (*target1++ != *target2++ || *target1++ != *target2++)
- {
- break;
- }
- }
- if (*target1++ != *target2++)
- {
- break;
- }
- index++;
- n--;
- }
复制代码
但我看不用区分ch<0的情况也能成功?
Q2:如果我把n处写成这样:
while (n-- && *target1 != '\0' && *target2 != '\0')
而这个问题只会在最后一个字符不同时出现
求助大佬!
- #include <stdio.h>
- #define MAX 1024
- int strncmp(char * s1 , char * s2 , int n)
- {
- char * p1 , * p2 ;
- int i , r ;
- for(i = 0 , p1 = s1 , p2 = s2 ; * p1 && * p2 && i < n ; p1 ++ , p2 ++ , i ++) {
- r = * p1 - * p2 ;
- if(* p1 < 0) {
- r = (* p1 - * p2) || (* (p1 + 1) - * (p2 + 1)) ;
- p1 ++ ;
- p2 ++ ;
- }
- if(r) break ;
- }
- return r ;
- }
- int main()
- {
- int n ;
- char str1[MAX] , str2[MAX] ;
- printf("Input the first string:") ;
- fgets(str1, MAX, stdin) ;
- printf("Input the secong string:") ;
- fgets(str2, MAX, stdin) ;
- printf("Input the number for comparing:") ;
- scanf("%d", &n) ;
- if(! strncmp(str1 , str2 , n)) printf("The same!\n") ;
- else printf("the difference!\n") ;
- }
复制代码
|
|