C语言字符串操作函数
1. 写一个函数实现字符串反转
voidstrRev(char*s)
{
chartemp,*end=s+strlen(s)-1;
while(end>s)
{
temp=*s;
*s=*end;
*end=temp;
--end;
++s;
}
}
{
chartemp,*end=s+strlen(s)-1;
while(end>s)
{
temp=*s;
*s=*end;
*end=temp;
--end;
++s;
}
}
版本2 - for版
voidstrRev(char*s)
{
chartemp;
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
temp=*s;
*s=*end;
*end=temp;
}
}
{
chartemp;
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
temp=*s;
*s=*end;
*end=temp;
}
}
版本3 - 不使用第三方变量
voidstrRev(char*s)
{
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
*s^=*end;
*end^=*s;
*s^=*end;
}
}
{
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
*s^=*end;
*end^=*s;
*s^=*end;
}
}
版本4 - 重构版本3
voidstrRev(char*s)
{
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
*s^=*end^=*s^=*end;
}
}
{
for(char*end=s+strlen(s)-1;end>s;--end,++s)
{
*s^=*end^=*s^=*end;
}
}
版本5 - 重构版本4
voidstrRev(char*s)
{
for(char*end=s+strlen(s)-1;end>s;*s++^=*end^=*s^=*end--);
}
{
for(char*end=s+strlen(s)-1;end>s;*s++^=*end^=*s^=*end--);
}
版本6 - 递归版
voidstrRev(constchar*s)
{
if(s[0]=='\0')
return;
else
strRev(&s[1]);
printf("%c",s[0]);
}
{
if(s[0]=='\0')
return;
else
strRev(&s[1]);
printf("%c",s[0]);
}
2. 实现库函数strcpy的功能
版本1
strcpy(char*dest,constchar*src)
{
char*p=dest;
while(*dest++=*src++)
;
dest=p;
}
{
char*p=dest;
while(*dest++=*src++)
;
dest=p;
}
版本2
char*__cdeclstrcpy(char*dst,constchar*src)
{
char*p=dst;
while(*p++=*src++)
;
returndst;
}
{
char*p=dst;
while(*p++=*src++)
;
returndst;
}
版本3
strcpy(char*dest,constchar*src)
{
inti=0;
for(;*(src+i)!='\0';i++)
*(dest+i)=*(src+i);
*(dest+i)='\0';
}
{
inti=0;
for(;*(src+i)!='\0';i++)
*(dest+i)=*(src+i);
*(dest+i)='\0';
}
3. 实现库函数atoi的功能
版本1 - 附说明
intpower(intbase,intexp)
{
if(0==exp)
return1;
returnbase*power(base,exp-1);
}
int__cdeclatoi(constchar*s)
{
intexp=0,n=0;
constchar*t=NULL;
for(;*s==''||*s=='\t'||*s=='\n';s++)//找到第一个非空字符
;
if(*s>'9'||*s<'0')//如果第一个非空字符不是数字字符,返回0
return0;
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++;
}
returnn;
}
{
if(0==exp)
return1;
returnbase*power(base,exp-1);
}
int__cdeclatoi(constchar*s)
{
intexp=0,n=0;
constchar*t=NULL;
for(;*s==''||*s=='\t'||*s=='\n';s++)//找到第一个非空字符
;
if(*s>'9'||*s<'0')//如果第一个非空字符不是数字字符,返回0
return0;
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++;
}
returnn;
}
版本2
int__cdeclatoi(constchar*s)
{
intexp=0,n=0;
constchar*t=NULL;
for(;*s==''||*s=='\t'||*s=='\n';s++)//略过非空字符
;
if(*s>'9'||*s<'0')
return0;
for(t=s;*t>='0'&&*t<='9';++t)
;
t--;
while(t>=s)
{
n+=(*t-48)*pow(10,exp);
t--;
exp++;
}
returnn;
}
{
intexp=0,n=0;
constchar*t=NULL;
for(;*s==''||*s=='\t'||*s=='\n';s++)//略过非空字符
;
if(*s>'9'||*s<'0')
return0;
for(t=s;*t>='0'&&*t<='9';++t)
;
t--;
while(t>=s)
{
n+=(*t-48)*pow(10,exp);
t--;
exp++;
}
returnn;
}
4. 实现库函数strlen的功能
版本1 - while版
size_t__cdeclstrlen(constchar*s)
{
inti=0;
while(*s)
{
i++;
s++;
}
returni;
}
{
inti=0;
while(*s)
{
i++;
s++;
}
returni;
}
版本2 - for版
size_t__cdeclstrlen(constchar*s)
{
for(inti=0;*s;i++,s++)
;
returni;
}
{
for(inti=0;*s;i++,s++)
;
returni;
}
版本3 - 无变量版
size_t__cdeclstrlen(constchar*s)
{
if(*s=='\0')
return0;
else
return(strlen(++s)+1);
}
{
if(*s=='\0')
return0;
else
return(strlen(++s)+1);
}
版本4 - 重构版本3
size_t__cdeclstrlen(constchar*s)
{
return*s?(strlen(++s)+1):0;
}
{
return*s?(strlen(++s)+1):0;
}
5. 实现库函数strcat的功能
版本1 - while版
char*__cdeclstrcat(char*dst,constchar*src)
{
char*p=dst;
while(*p)
p++;
while(*p++=*src++)
;
returndst;
}
{
char*p=dst;
while(*p)
p++;
while(*p++=*src++)
;
returndst;
}
6. 实现库函数strcmp的功能
版本1 - 错误的strcmp
intstrcmp(constchar*a,constchar*b)
{
for(;*a!='\0'&&*b!='\0';a++,b++)
if(*a>*b)
return1;
elseif(*a==*b)
return0;
else
return-1;
}
{
for(;*a!='\0'&&*b!='\0';a++,b++)
if(*a>*b)
return1;
elseif(*a==*b)
return0;
else
return-1;
}
版本2
int__cdeclstrcmp(constchar*src,constchar*dst)
{
intret=0;
while(!(ret=*(unsignedchar*)src-*(unsignedchar*)dst)&&*src)
++src,++dst;
if(ret<0)
ret=-1;
elseif(ret>0)
ret=1;
return(ret);
}
{
intret=0;
while(!(ret=*(unsignedchar*)src-*(unsignedchar*)dst)&&*src)
++src,++dst;
if(ret<0)
ret=-1;
elseif(ret>0)
ret=1;
return(ret);
}
#include<stdio.h>
intis_vowel(chara)
{
switch(a)
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':
return1;break;
default:
return0;break;
}
}
intcount_vowel(constchar*s)
{
intnum;
if(s[0]=='\0')
num=0;
else
{
if(is_vowel(s[0]))
num=1+count_vowel(&s[1]);
else
num=count_vowel(&s[1]);
}
returnnum;
}
intmain()
{
char*s="AobCdddudIe";
printf("%d\n",count_vowel(s));
return0;
}
intis_vowel(chara)
{
switch(a)
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':
return1;break;
default:
return0;break;
}
}
intcount_vowel(constchar*s)
{
intnum;
if(s[0]=='\0')
num=0;
else
{
if(is_vowel(s[0]))
num=1+count_vowel(&s[1]);
else
num=count_vowel(&s[1]);
}
returnnum;
}
intmain()
{
char*s="AobCdddudIe";
printf("%d\n",count_vowel(s));
return0;
}
8. 判断一个字符串是否回文:包含一个单词,或不含空格、标点的短语。如:Madam I'm Adam是回文
版本1
/*
*程序功能:判断一个单词,或不含空格、标点符号的短语是否为回文(palindrome)
*/
#include<stdio.h>
#include<ctype.h>
intis_palindrome(constchar*s)
{
boolis_palindrome=0;
constchar*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);
}
intmain()
{
constchar*s="MadamI'mAdam";
printf("%s%s\n",s,is_palindrome(s)?"isapalindrome!":"isnotapalindrome!");
return0;
}
*程序功能:判断一个单词,或不含空格、标点符号的短语是否为回文(palindrome)
*/
#include<stdio.h>
#include<ctype.h>
intis_palindrome(constchar*s)
{
boolis_palindrome=0;
constchar*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);
}
intmain()
{
constchar*s="MadamI'mAdam";
printf("%s%s\n",s,is_palindrome(s)?"isapalindrome!":"isnotapalindrome!");
return0;
}
有趣的回文:He lived as a devil, eh?
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语言字符串操作函数 C语言字符串操作函数是一组强大且实用的函数,用于处理和操作字符串。这些函数在C语言编程中非常常用,掌握这些函数可以提高编程效率和质量。本章将详细介绍C语言字符串操作函数的使用方法和...
C语言字符串替换函数strrpl支持中文汉字,解决含中文汉字,可能替换错误的情况。支持GBK、GB18030字符串。
C语言字符串操作函数[汇编].pdf
C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符...
本文将详细讲解几个常用的C语言字符串操作函数,包括`stpcpy`、`strcat`、`strchr`、`strcmp`以及`strncmpi`。 1. `stpcpy`函数: `stpcpy`函数用于将一个字符串复制到另一个字符串中,它的功能类似于`strcpy`,但...
几个字符串处理函数增强版 常用需求基本都能完成 已经编译成DLL 函数列表 兼容字符和串 void revstr char str 字符串反转 int substring char res int pos int len char substr 从pos开始取len个字符到substr中 ...
C语言字符串函数大全是C语言中对字符串操作的集合,包括字符串拷贝、字符串拼接、字符串查找、字符串比较等多种操作。下面是对这些函数的详细介绍: 1. stpcpy函数: stpcpy函数用来拷贝一个字符串到另一个字符串。...
本资源"《C语言字符串练习(习题+答案).zip》"正是针对这一需求而准备的,它包含了C语言字符串操作的专项练习题和对应的答案,帮助学习者巩固和提升在字符串处理方面的技能。 字符串在C语言中扮演着重要角色,它们...
C语言字符串处理函数整理版本,包含字符串基本操作,字符串类型转换、字符检查、输入输出流、输入输出流分割、异常处理等
如果C语言字符串是宽字符串,可以使用Py_BuildValue()函数或PyUnicode_FromWideChar()函数来构建一个字符串,例如: ```c wchar_t *w; /* Wide character string */ int len; /* Length */ PyObject *obj = Py_...
还有一点值得引起注意:当你引用 strsafe 系列函数时,原有的 C 语言字符串处理函数都将被自动进行 #undef 处理。这也没问题,因为调试过程中的出错信息将会告诉你哪些函数已经被相应的 strsafe 系列函数取代了。好...
C语言字符串函数是C语言中用于操作字符串的函数,包括字符串拷贝、字符串拼接、字符串查找、字符串比较等。这些函数在C语言编程中非常重要,本文将对这些函数进行详细的介绍。 1. stpcpy函数 stpcpy函数的功能是将...
C语言本身并不像其他高级语言那样内置了丰富的字符串操作函数,但通过标准库中的`<string.h>`我们可以使用一些基本的字符串函数,如`strcpy`、`strlen`等。然而,为了更好地理解和掌握C语言,有时我们需要自己动手...
下面是用C语言实现不使用是strcat 函数实现连接两个字符串的功能。 源代码: #include void constring(char s[],char t[],char q[]); //函数声明 int main(void) { char s[100]; char q[100]; char t[200]; ...