C语言字符串操作函数
感觉挺实用的,在此转载引用下供以后学习用,在此感谢JCSU提供本文
1. 字符串反转 - strRev
2. 字符串复制 - strcpy
3. 字符串转化为整数 - atoi
4. 字符串求长 - strlen
5. 字符串连接 - strcat
6. 字符串比较 - strcmp
7. 计算字符串中的元音字符个数
8. 判断一个字符串是否是回文
1. 写一个函数实现字符串反转
版本1 - while版
void strRev(char *s)
{
char temp, *end = s + strlen(s) - 1;
while( end > s)
{
temp = *s;
*s = *end;
*end = temp;
--end;
++s;
}
}
版本2 - for版
void strRev(char *s)
{
char temp;
for(char *end = s + strlen(s) - 1; end > s ; --end, ++s)
{
temp = *s;
*s = *end;
*end = temp;
}
}
版本3 - 不使用第三方变量
void
strRev(
char
*
s)
{
for
(
char
*
end
=
s
+
strlen(s)
-
1
; end
>
s ;
--
end,
++
s)
{
*
s
^=
*
end;
*
end
^=
*
s;
*
s
^=
*
end;
}
}
版本4 - 重构版本3
void strRev(char *s)
{
for(char *end = s + strlen(s) - 1; end > s ; --end, ++s)
{
*s ^= *end ^= *s ^= *end;
}
}
版本5 - 重构版本4
void
strRev(
char
*
s)
{
for
(
char
*
end
=
s
+
strlen(s)
-
1
; end
>
s ;
*
s
++
^=
*
end
^=
*
s
^=
*
end
--
);
}
版本6 - 递归版
void
strRev(
const
char
*
s)
{
if
(s[
0
]
==
'
/0
'
)
return
;
else
strRev(
&
s[
1
]);
printf(
"
%c
"
,s[
0
]);
}
2. 实现库函数strcpy的功能
strcpy函数位于头文件<string.h>中
版本1
strcpy(
char
*
dest,
const
char
*
src)
{
char
*
p
=
dest;
while
(
*
dest
++
=
*
src
++
)
;
dest
=
p;
}
版本2
char
*
__cdecl strcpy(
char
*
dst,
const
char
*
src)
{
char
*
p
=
dst;
while
(
*
p
++
=
*
src
++
)
;
return
dst;
}
版本3
strcpy(
char
*
dest,
const
char
*
src)
{
int
i
=
0
;
for
(;
*
(src
+
i)
!=
'
/0
'
; i
++
)
*
(dest
+
i)
=
*
(src
+
i);
*
(dest
+
i)
=
'
/0
'
;
}
3. 实现库函数atoi的功能
atoi函数位于头文件<stdlib.h>中
版本1 - 附说明
int
power(
int
base
,
int
exp)
{
if
(
0
==
exp )
return
1
;
return
base
*
power(base
, exp
-
1
);
}
int
__cdecl atoi(
const
char
*
s)
{
int
exp
=
0
, n
=
0
;
const
char
*
t
=
NULL;
for
(;
*
s
==
'
'
||
*
s
==
'
/t
'
||
*
s
==
'
/n
'
; s
++
)
//
找到第一个非空字符
;
if
(
*
s
>
'
9
'
||
*
s
<
'
0
'
)
//
如果第一个非空字符不是数字字符,返回0
return
0
;
for
(t
=
s;
*
t
>=
'
0
'
&&
*
t
<=
'
9
'
;
++
t)
//
找到第一个非数字字符位置 - 方法1
;
t
--
;
/*
找到第一个非数字字符位置 - 方法2
t=s;
while(*t++ >='0' && *t++ <='9')
;
t -= 2;
*/
while
(t
>=
s)
{
n
+=
(
*
t
-
48
)
*
power(
10
, exp);
//
数字字符转化为整数
t
--
;
exp
++
;
}
return
n;
}
版本2
int
__cdecl atoi(
const
char
*
s)
{
int
exp
=
0
, n
=
0
;
const
char
*
t
=
NULL;
for
(;
*
s
==
'
'
||
*
s
==
'
/t
'
||
*
s
==
'
/n
'
; s
++
)
//
略过非空字符
;
if
(
*
s
>
'
9
'
||
*
s
<
'
0
'
)
return
0
;
for
(t
=
s;
*
t
>=
'
0
'
&&
*
t
<=
'
9
'
;
++
t)
;
t
--
;
while
(t
>=
s)
{
n
+=
(
*
t
-
48
)
*
pow(
10
, exp);
t
--
;
exp
++
;
}
return
n;
}
4. 实现库函数strlen的功能
strlen函数位于头文件<string.h>中
版本1 - while版
size_t __cdecl strlen(
const
char
*
s)
{
int
i
=
0
;
while
(
*
s )
{
i
++
;
s
++
;
}
return
i;
}
版本2 - for版
size_t __cdecl strlen(
const
char
*
s)
{
for
(
int
i
=
0
;
*
s; i
++
, s
++
)
;
return
i;
}
版本3 - 无变量版
size_t __cdecl strlen(
const
char
*
s)
{
if
(
*
s
==
'
/0
'
)
return
0
;
else
return
(strlen(
++
s)
+
1
);
}
版本4 - 重构版本3
size_t __cdecl strlen(
const
char
*
s)
{
return
*
s
?
(strlen(
++
s)
+
1
) :
0
;
}
5. 实现库函数strcat的功能
strcat函数位于头文件<string.h>中
版本1 - while版
char
*
__cdecl strcat(
char
*
dst,
const
char
*
src)
{
char
*
p
=
dst;
while
(
*
p )
p
++
;
while
(
*
p
++
=
*
src
++
)
;
return
dst;
}
6. 实现库函数strcmp的功能
strcmp函数位于头文件<string.h>中
版本1 - 错误的strcmp
int
strcmp(
const
char
*
a,
const
char
*
b)
{
for
(;
*
a
!=
'
/0
'
&&
*
b
!=
'
/0
'
; a
++
, b
++
)
if
(
*
a
>
*
b)
return
1
;
else
if
(
*
a
==*
b)
return
0
;
else
return
-
1
;
}
版本2
int
__cdecl strcmp (
const
char
*
src,
const
char
*
dst)
{
int
ret
=
0
;
while
(
!
(ret
=
*
(unsigned
char
*
)src
-
*
(unsigned
char
*
)dst)
&&
*
src)
++
src,
++
dst;
if
( ret
<
0
)
ret
=
-
1
;
else
if
( ret
>
0
)
ret
=
1
;
return
( ret );
}
7. 计算字符串中元音字符的个数
#include
<
stdio.h
>
int
is_vowel(
char
a)
{
switch
(a)
{
case
'
a
'
:
case
'
A
'
:
case
'
e
'
:
case
'
E
'
:
case
'
i
'
:
case
'
I
'
:
case
'
o
'
:
case
'
O
'
:
case
'
u
'
:
case
'
U
'
:
return
1
;
break
;
default
:
return
0
;
break
;
}
}
int
count_vowel(
const
char
*
s)
{
int
num;
if
(s[
0
]
==
'
/0
'
)
num
=
0
;
else
{
if
(is_vowel(s[
0
]))
num
=
1
+
count_vowel(
&
s[
1
]);
else
num
=
count_vowel(
&
s[
1
]);
}
return
num;
}
int
main()
{
char
*
s
=
"
AobCd ddudIe
"
;
printf(
"
%d /n
"
, count_vowel(s));
return
0
;
}
8. 判断一个字符串是否回文:包含一个单词,或不含空格、标点的短语。如:Madam I'm Adam是回文
版本1
/*
* 程序功能:判断一个单词,或不含空格、标点符号的短语是否为回文(palindrome)
*/
#include
<
stdio.h
>
#include
<
ctype.h
>
int
is_palindrome(
const
char
*
s)
{
bool
is_palindrome
=
0
;
const
char
*
end
=
s;
if
(
*
end
==
'
/0
'
)
/*
如果s为空串,则是回文
*/
is_palindrome
=
1
;
while
(
*
end)
++
end;
/*
end指向串s最后一个字符位置
*/
--
end;
while
(s
<=end)
{
while
(
*
s
==
'
'
||
!
isalpha(
*
s))
/*
略去串s中的非字母字符 */
++s;
while
(
*
end
==
'
'
||
!
isalpha(*end))
--end;
if
(toupper(
*
s)
==
toupper(
*
end))
/*
将s中的字母字符转换为大字进行判断 */
{
++s;
--end;
}
else
{
is_palindrome
=
0
; break;
}
/*
在s<=end的条件下,只要出现不相等就判断s不是回文 */
}
if
(s>end)
is_palindrome
=1;
else
is_palindrome=0;
return (is_palindrome);
}
int main()
{
const
char
*
s
=
"
Madam I' m Adam";
printf(
"
%s %s /n
"
, s, is_palindrome(s)
?
"
is a palindrome!
"
:
"
is not a palindrome!");
return
0;
}