69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdlib.h>
#include <stdio.h>
#define ToLower(x) ( x&(~0x20) )
#define IsLetter(x) ( 'a'<= x && x <='z' || 'A' <= x && x <= 'Z' )
int compare(char *dest,char *src)
{
if(dest==NULL || src==NULL) //字符串非法
{
abort();
}
if(dest == src) //同一字符串
{
return 0;
}
char *first=dest,*second=src;
bool hasChanged=false;
while(*first!=0 && *second!=0)
{
if(IsLetter(*first) && IsLetter(*second))
{
if(*first == *second)
{
++first,++second;
}
else if(ToLower(*first) == ToLower(*second))
{
++first,++second;
hasChanged=true;
}
else
{
return 3;
}
}
else
{
if(*first == *second)
{
++first,++second;
}
else
{
return 3;
}
}
}
if(*first == 0 && *second == 0)
{
if(hasChanged)
{
return 1;
}
--first,--second;
while(dest <= first)
{
char temp=*dest;
*dest=*src=*first;
*first=*second=temp;
++dest,++src,--first,--second;
}
return 0;
}
else
{
return 3;
}
}
int main()
{
char str1[]="abcd",str2[]="abcd";
printf("%d\n%s\n%s\n",compare(str1,str2),str1,str2);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int compare(const char *src1, const char *src2)
{
unsigned char tab1[256] = {0};
unsigned char tab2[256] = {0};
int i, cnt = 0;
assert (NULL != src1 && NULL != src2);
while (*src1)
{
++tab1[*src1++];
++cnt;
}
while (*src2)
{
++tab2[*src2++];
--cnt;
}
//如果字符串长度不相等,返回3
if (cnt != 0)
return 3;
for (i = 0; i < 256; i++)
{
if (tab1[i] != tab2[i])
break;
}
//如果完全相同返回0
if (i == 256)
return 0;
else
{
//不是仅由于大小写造成的不同返回3
if (i < 'A')
return 3;
for (; i <= 'Z'; i++)
{
if ((tab1[i] + tab1[i | 0x20]) != (tab2[i] + tab2[i | 0x20]))
return 3;
}
for (; i < 'a'; i++)
{
if (tab1[i] != tab2[i])
return 3;
}
for (; i <= 'z'; i++)
{
if ((tab1[i] + tab1[i & ~0x20]) != (tab2[i] + tab2[i & ~0x20]))
return 3;
}
for (; i < 256; i++)
{
if (tab1[i] != tab2[i])
return 3;
}
return 1;
}
}
int main()
{
char *p1 = "dahxdasdDaa";
char *p2 = "adhdadadAsx";
printf("%d\n", compare(p1, p2));
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 255
int strlen(char *str);
int compare(char *dest,char *src);
int main()
{
char *dest = (char*)malloc(MAX_SIZE);
char *src = (char*)malloc(MAX_SIZE);
printf("Enter two string\n");
scanf("%s",dest);
scanf("%s",src);
int result = compare(dest,src);
printf("the return value is %d\n",result);
free(dest);
free(src);
return 0;
}
int compare(char *dest,char *src)
{
int destLen = strlen(dest);
int srcLen = strlen(src);
char *d = dest;
char *s = src;
int result = -1;
int count1 = 0;
int count2 = 0;
if(destLen == srcLen)
{
while(*d !='\0' && *s != '\0' )
{
if(*d == *s)
count1++;
if(*d == *s || *d == *s-32 || *d == *s+32)
count2++;
d++;
s++;
}
if(destLen == count1)
result = 0;
if(destLen == count2)
result = 1;
else
result = 3;
}
else
result = 3;
return result;
}
int strlen(char *str)
{
char * temp = str;
while((*temp++ ) != '\0');
return (temp - str -1);
}
/*
题一:给出一个函数,原型为 int compare(char* dest,char* src)
要求比较两个字符串(由dest与src字符指针标识)
1,如果两字符串所含字母完全相同,则返回0;
2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
3,否则返回3
PS:
1、手上没编译器,就这么写吧,要是有谁愿意帮忙验证下,我就感激不尽了
2、比较赞成80楼jackyid对题目的理解
3、题目并没有要求字母出现次数相同,所以abc和abcc也应该返回0
*/
int compare(char* dest,char* src)
{
int sdRet_1 = 0;
int sdRet_2 = 0;
unsigned int i = 0;
const unsigned int dArraySize = 256;
char szDestBitmap[dArraySize];
char szSrcBitmap[dArraySize];
char *pszTmpBitmap = NULL;
char *pszTmpStr = NULL;
if(!dest||!src)
{
return -1;//题目没定义这个行为,返回-1吧
}
//保证初始值为0
memset(szDestBitmap, 0, dArraySize);
memset(szSrcBitmap, 0, dArraySize);
//遍历dest和src,建立位图
while(dest[i]&&src[i])
{
szDestBitmap[dest[i]] = 1;
szSrcBitmap[src[i]] = 1;
i++;
}
if(dest[i]==0)
{
pszTmpBitmap = szSrcBitmap;
pszTmpStr = src;
}
else
{
pszTmpBitmap = szDestBitmap;
pszTmpStr = dest;
}
while(pszTmpStr[i])
{
pszTmpBitmap[pszTmpStr[i]] = 1;
i++;
}
//比较位图,只需要比较A-Z和a-z,如果比较结果相同,则直接返回0
sdRet_1 = memcmp(szDestBitmap+'A',szSrcBitmap+'A', 'Z'-'A'+1);
sdRet_2 = memcmp(szDestBitmap+'a',szSrcBitmap+'a', 'z'-'a'+1);
if((sdRet_1==0) && (sdRet_2==0))
{
return 0;
}
else//不同
{
//分别将dest和src的A-Z和a-z合并
for(i=0; i<26; i++)
{
szDestBitmap[i+'A'] = (szDestBitmap[i+'a']||szDestBitmap[i+'A']) ? 1 : 0;
szSrcBitmap[i+'A'] = (szSrcBitmap[i+'a']||szSrcBitmap[i+'A']) ? 1 : 0;
}
//比较合并结果
sdRet_1 = memcmp(szDestBitmap+'A',szSrcBitmap+'A', 'Z'-'A'+1);
if(sdRet_1==0)
{
return 1;
}
else
{
return 3;
}
}
}
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <process.h>
#include <string.h>
#include <math.h>
//题一:给出一个函数,原型为 int compare(char* dest,char* src)
//要求比较两个字符串(由dest与src字符指针标识)
//1,如果两字符串所含字母完全相同,则逆序输出字符串并返回0;
//2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
//3,否则返回3
//字母个数
#define ALPHANUM ('Z'-'A'+1)
//把字符串字母一个一个(重复算一个)按大小对应写入alpha中
//alpha字母排序如:A00000..Zab000...z
//返回值:src的长度
int fetchAlpha(char alpha[ALPHANUM*2],const char *src)
{
int i=0;
memset(alpha,'1',ALPHANUM*2);
for (; src[i] != '\0'; ++i)
{
if((src[i] >='a' && src[i] <='z'))
alpha[ src[i] - 'a' + ALPHANUM] = src[i];
else if((src[i] >='A' && src[i] <='Z'))
alpha[ src[i] - 'A' ] = src[i];
else ;
}
return i;
}
int compare(char *dest, char *src)
{
if(dest == NULL && src == NULL) return 0;
if(dest == NULL || src == NULL) return 3;
char alphaDest[ALPHANUM*2],alphaSrc[ALPHANUM*2];
int len = fetchAlpha(alphaDest,dest);
fetchAlpha(alphaSrc,src);
int count1 = 0;//记数:情况1
int count2 = 0;//记数:情况2
for(int i=0; i<ALPHANUM*2; ++i)
{
if(alphaDest[i] == alphaSrc[i])
++count1;
else if( abs(alphaDest[i] - alphaSrc[(ALPHANUM+i)%(ALPHANUM*2)]) == abs('A'-'a') ) //判断类似fetchAlpha中alpha数组中A与a(B与b...Z与z)的位置内容
++count2;
}
if(count1 == ALPHANUM*2)
{
for(int i=len-1; i>=0; --i) printf("%c",dest[i]);
return 0;
}
else if(count1 + count2*2 == ALPHANUM*2)
return 1;
else
return 3;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *dest[] = {"abcabc","ABC","ABC","ABC","EFS","AZ"}; char *src[] = {"Abc","ABC","ABCD","!BC","EFA","za"};
for(int i=0; i<6; i++)
printf("[%s-%s:%d]\n",dest[i],src[i],compare(dest[i],src[i]));
system("pause");
return 0;
}
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <process.h>
//题一:给出一个函数,原型为 int compare(char* dest,char* src)
//要求比较两个字符串(由dest与src字符指针标识)
//1,如果两字符串所含字母完全相同,则逆序输出字符串并返回0;
//2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
//3,否则返回3
int isAlpha(char ch)
{
if( (ch >= 'a' && ch <='z') ||
(ch >= 'A' && ch <='Z') )
return 1;
else
return 0;
}
int compare(char *dest, char *src)
{
if(dest == NULL && src == NULL) return 0;
if(dest == NULL || src == NULL) return 3;
int i=0,j=0;
int sameA=0,sameB=0;
while(dest[i] != '\0' || src[j] != '\0')
{
if(i != j) break;
if(dest[i] == src[j]) ++sameA;//完全相等的次数
if(dest[i] - src[j] == 'A'-'a' || dest[i] - src[j] == 'a'-'A')
{
if(isAlpha(dest[i]) && isAlpha(src[j]))
++sameB;//字母仅大小写不同的次数
}
if( dest[i] != '\0') ++i;
if( src[j] != '\0') ++j;
}
if(i == j)//两字符串长度相等
{
if(sameA == i)
{
for(--i;i>=0;--i)
printf("%c",dest[i]);
return 0;
}
else if(sameA + sameB == i)//所有对应字母都是完全相等与忽略大小写之间。
return 1;
else
return 3;
}
else
return 3;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *dest[] = {"abc","ABC","ABC","ABC","EFS"}; char *src[] = {"Abc","ABC","ABCD","!BC","EFA"};
for(int i=0; i<5; i++)
printf("[%s-%s:%d]\n",dest[i],src[i],compare(dest[i],src[i]));
system("pause");
return 0;
}