判断两个字符串的内容是否相同

Author Avatar
Mutse Young 3月 11, 2010

字符串内容相同,也就是忽略字符串中的空格符和不可见的控制符号,其它字符是否相同。那么如何判断两个字符串的内容是否相同?

下面以一个例子来说明:

1
2
char *str1 = “Hello, World!”;
char *str2 = “ Hello World!”;

要比较上述例子中两个字符串内容是否相同,应分为两种情况来讨论:

  • 忽略标点字符;
  • 不忽略标点字符。

若忽略标点字符,则字符串str1和字符串str2的内容相同;若不忽略标点字符,则两字符串的内容不相同。

弄清楚了什么是字符串内容相同的概念后,开始剖析如何实现这一功能。

算法思路:

  • 使用两指针分别同时遍历两个字符串;
  • 在遍历的过程中,每遍历一个字符,应先判断该字符是否是字母或数字。若是,则设置相应的标记为TRUE;若不是,再判断是否是空格符或控制符;
  • 若该字符是空格符或控制符,指针向后移动一位;若不是,再判断是否是标点字符;
  • 若是标点字符,且忽略,指针向后移动一位;若不忽略,则设置相应的标记为TRUE;
  • 若两字符串的标记都为TRUE,则进行字符比较。若相同,则返回步骤2,继续遍历;若不同,则返回1(内容不相同);
  • 遍历直至其中一个字符串到结束符的位置,停止循环;
  • 然后判断另一个字符串中未遍历的字符是否是字母或数字;若是,则返回1;若不是,再判断是否是标点字符;
  • 若是标点字符,且忽略,继续遍历,直至该字符串遍历完毕;若不忽略,则返回1;当两字符串都遍历完毕,则两字符串的内容相同。

函数原型:

1
int strccmp(const char *str1, const char *str2, int flag);

参数说明:

str1: 字符串
str2: 字符串
flag: 是否忽略标点字符标记
返回值:若返回值为1,则两字符串内容不相同;若返回值为0,则内容相同。

源码

附:strccmp.c 程序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* 文件名: strccmp.c
* 描述:
* 比较两字符串的内容是否相同,其中忽略空格字符和控制符,
* 是否忽略标点符,依标记flag的值而定。若flag为TRUE,
* 则忽略;若flag为FALSE,则不忽略。
*
* 日期: 2010年3月11日
* 作者: 默之 <yyhoo2.young@gmail.com>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0

int isnonaln(int c, int flag);
int strccmp(const char *s1, const char *s2, int flag);

int main()
{
char s1[] = "hello 55,6, oworld !!";
char s2[] = " hello 5 56 o world!";

printf("strccmp(s1,s2) = %d\n", strccmp(s1, s2, TRUE));
return 0;
}

/* checks for an alphanumeric character, not a black character
* or a control character
*
*/
int isnonaln(int c, int flag)
{
if (isalnum(c) == 0)
{
if (isblank(c) != 0 || iscntrl(c) != 0)
{
return 0;
}

if (ispunct(c) != 0)
{
if (flag == TRUE)
{
return 0;
}
else
{
return 1;
} // if flag
}
}

return 1;
}

/* compare the two strings s1 & s2 by their contents. the value returned is one
* if the two string are equal by their contents, and a zero if not.
*
*/
int strccmp(const char *s1, const char *s2, int flag)
{
const char *p1 = s1;
const char *p2 = s2;
int ischar1 = FALSE;
int ischar2 = FALSE;

while (*p1 != '\0' && *p2 != '\0')
{
if (isnonaln(*p1, flag) == 0)
{
p1++;
}
else
{
ischar1 = TRUE;
}

if (isnonaln(*p2, flag) == 0)
{
p2++;
}
else
{
ischar2 = TRUE;
}

if (ischar1 == TRUE && ischar2 == TRUE)
{
if (*p1 == *p2)
{
ischar1 = FALSE;
ischar2 = FALSE;
p1++;
p2++;
}
else
{
return 1;
}
}

} // while p1

while (*p1 != '\0' || *p2 != '\0')
{
if (*p1 != '\0')
{
if (isnonaln(*p1, flag) != 0)
{
return 1;
}
else
{
p1++;
}
}

if (*p2 != '\0')
{
if (isnonaln(*p2, flag) != 0)
{
return 1;
}
else
{
p2++;
}
}

}

return 0;
}