博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串操作函数
阅读量:4948 次
发布时间:2019-06-11

本文共 4517 字,大约阅读时间需要 15 分钟。

C语言字符串操作函数

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;
}

 

转载于:https://www.cnblogs.com/chasu/archive/2013/05/24/3097622.html

你可能感兴趣的文章
C语言 memcpy二维数组的复制
查看>>
Infix to Postfix Expression
查看>>
win7任务栏还原为xp样式
查看>>
PYTHON_3和2
查看>>
json数组的取值方法
查看>>
2019-7-15 vue01day
查看>>
SELECT LOCK IN SHARE MODE and FOR UPDATE
查看>>
Perl/Nagios – Can’t locate utils.pm in @INC
查看>>
目录导航「深入浅出ASP.NET Core系列」
查看>>
Git常用命令拾遗
查看>>
Canvas的drawImage方法使用
查看>>
自定义适用于手机和平板电脑的 Dynamics 365(四):窗体脚本
查看>>
阴影效果参考网址
查看>>
华为交换机端口镜像
查看>>
简易爬虫(爬取本地数据)
查看>>
一位菜鸟的java 最基础笔记
查看>>
python 进程间通信
查看>>
字符串和编码
查看>>
servlet(一)
查看>>
异常实验
查看>>