C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
原文:http://www.cnblogs.com/JCSU/articles/1305401.html
C语言字符串操作函数
1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen
5. 字符串连接 - strcat6. 字符串比较 - 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;
}
有趣的回文:He lived as a devil, eh?
Don't nod
Dogma: I am God
Never odd or even
Too bad – I hid a boot
Rats live on no evil star
No trace; not one carton
Was it Eliot's toilet I saw?
Murder for a jar of red rum
May a moody baby doom a yam?
Go hang a salami; I'm a lasagna hog!
Satan, oscillate my metallic sonatas!
A Toyota! Race fast... safe car: a Toyota
Straw? No, too stupid a fad; I put soot on warts
Are we not drawn onward, we few, drawn onward to new era?
Doc Note: I dissent. A fast never prevents a fatness. I diet on cod
No, it never propagates if I set a gap or prevention
Anne, I vote more cars race Rome to Vienna
Sums are not set as a test on Erasmus
Kay, a red nude, peeped under a yak
Some men interpret nine memos
Campus Motto: Bottoms up, Mac
Go deliver a dare, vile dog!
Madam, in Eden I'm Adam
Oozy rat in a sanitary zoo
Ah, Satan sees Natasha
Lisa Bonet ate no basil
Do geese see God?
God saw I was dog
Dennis sinned
世界之最:世界上最长的回文包含了17,259个单词
说明:__cdecl,__stdcall是声明的函数调用协议.主要是传参和弹栈方面的不同.一般c++用的是__cdecl,windows里大都用的是__stdcall(API)
C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文的更多相关文章
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- C语言字符串操作函数总结
转载来源:https://blog.csdn.net/qq_33757398/article/details/81212618 字符串相关操作头文件:string.h 1.strcpy函数 原型:st ...
- C语言字符串操作函数整理
整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...
- C语言字符串操作函数
1.函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include < ...
- C语言字符串操作函数实现
1.字符串反转 – strRev void strRev(char *str) { assert(NULL != str); int length=strlen(str); ; while(end ...
- C语言-字符串操作函数
gets(char buffer[]) 从标准输入读取一行, 并去掉换行符, 在字符串末尾增加 '\0' 字符, 写入到缓冲区 成功则返回 buffer 的地址, 出错或者遇到文件结尾则返回空指针, ...
- c语言字符串操作大全
C语言字符串操作函数 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #incl ...
- 实现字符串函数,strlen(),strcpy(),strcmp(),strcat()
实现字符串函数,strlen(),strcpy(),strcmp(),strcat() #include<stdio.h> #include<stdlib.h> int my_ ...
- C语言的常用字符串操作函数(一)
一直做的是单片机相关的程序设计,所以程序设计上更偏向底层,对于字符串的操作也仅限于液晶屏幕上的显示等工作,想提高下字符串操作的水平,而不是笨拙的数组替换等方式,翻看帖子发现C语言的字符串操作函数竟然这 ...
随机推荐
- POJ_3264 Balanced Lineup 【线段树 + 区间查询】
一.题面 POJ3264 二.分析 典型的线段树的题,没有更新只有查询. 查询的时候需要注意的是,在判断区间是完全属于右子树还是左子树时,要根据建树的情况来选择,不然会出错.具体看代码 三.AC代码 ...
- 转 $.ajax()方法详解
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- STM32的固件升级(RTT
STM32 通用 Bootloader ,让 OTA 更加 Easy 目前支持F1/F4,在线制作bootloader,准备固件升级,是RTT的云设备管理平台 https://mp.weixin.qq ...
- C#利用WebBrowser获取完整COOKIE
代码: http://www.cnblogs.com/hsapphire/archive/2010/09/10/1823384.html http://blog.csdn.net/attilax/ar ...
- 常见Http协议响应码
总体总结: 1XX:信息相应类,表示接受到请求并且继续处理 2XX:处理成功响应类,表示动作被成功的接收.理解和接受 3XX:重定向响应类,为了完成指定的动作,必须完成进一步处理和操作 4XX:客户端 ...
- 【Lua】LWT遍历指定目录并输出到页面中
首先用lua遍历目录: function getDirs(path) local s = {} function attrdir(p) for file in lfs.dir(p) do if fil ...
- 【LESS系列】基本语法
这里将直接以实例的方式展示 LESS 的基本语法. less code 是编译前的代码,css code 是编译后的代码. 本文的内容,同样是引自[http://www.ibm.com/develop ...
- 移动前端 HTML5 head
移动前端不得不了解的HTML5 head 头标签(2016最新版) 发表于 2016年10月20日 by 愚人码头 被浏览 875 次 小编推荐:掘金是一个高质量的技术社区,从 ECMAScript ...
- iOS 开发工具网页下载
iOS 开发工具网页下载地址: https://developer.apple.com/downloads/
- Golang教程:函数、变参函数
函数是完成一个特定任务的代码块.一个函数接受输入,对输入进行一些运算并产生输出. 函数声明 在 Go 中声明一个函数的语法为: func functionname(parametername type ...