700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c语言字符串函数难题 一些常见的C语言字符串操作

c语言字符串函数难题 一些常见的C语言字符串操作

时间:2019-07-05 07:07:34

相关推荐

c语言字符串函数难题 一些常见的C语言字符串操作

#字符串倒序输出

实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题。

如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。

#include"stdio.h"

voidrechange_str(char*str)

{

inti,len;

chartmp;

return;

}

len=strlen(str);

for(i=0;i"hello,world";

printf("%s

",str);

rechange_str(str);

printf("%s

",str);

return(0);

}

程序输出

hello,world

dlrow,olleh

--------------------------------

Processexitedafter0.02841secondswithreturnvalue0

请按任意键继续...

#整型转字符串

实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-F。

用个位数对应值转为字符,注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作

下面这段代码需要好好研究一下,最好自己运行试试。

#include"stdio.h"

char*sky_itoa(intvalue,char*str,unsignedintradix)

{

charlist[]="0123456789ABCDEF";

unsignedinttmp_value;

inti,j,k;

if(NULL==str){

returnNULL;

}

if(2!=radix&&8!=radix&&10!=radix&&16!=radix){

returnNULL;

}

i=0;

k=0;

if(radix==10&&value'-';

k=1;

}else{

tmp_value=(unsignedint)value;

}

do{

str[i++]=list[tmp_value%radix];

tmp_value/=radix;

}while(tmp_value);

str[i]='';

//翻转

chartmp;

for(j=k;jreturnstr;

}

intmain(void)

{

inta=1254545;

charstr[100]={0};

printf("%s

",sky_itoa(a,str,2));

printf("%s

",sky_itoa(a,str,8));

printf("%s

",sky_itoa(a,str,10));

printf("%s

",sky_itoa(a,str,16));

return(0);

}

程序输出

100110010010010010001

4622221

1254545

132491

--------------------------------

Processexitedafter0.02963secondswithreturnvalue0

请按任意键继续...

#字符串复制

实现逻辑,逐个赋值直到遇到''停止即可

#include"stdio.h"

char*sky_strcpy(char*dst,constchar*str)

{

if(NULL==dst||NULL==str){

returnNULL;

}

char*ret=dst;

while(*str!=''){

*dst++=*str++;

}

returnret;

}

intmain(void)

{

charstr_1[100]="hello,world";

charstr[100]={0};

sky_strcpy(str,str_1);

printf("str_1:%s

",str_1);

printf("str:%s

",str);

return(0);

}

程序输出

str_1:hello,world

str:hello,world

--------------------------------

Processexitedafter0.03334secondswithreturnvalue0

请按任意键继续...

#字符串比较

1、正常比较是否相同 实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同

#include"stdio.h"

intsky_strcmp(char*dst,char*str)

{

inti,len;

if(NULL==dst||NULL==str){

return0;

}

if(strlen(dst)!=strlen(str)){

return0;

}

len=strlen(dst);

for(i=0;iif(*dst++!=*str++){

return0;

}

}

return1;

}

intmain(void)

{

charstr_1[100]="hello,world";

charstr_2[100]="hello,world";

charstr[100]="adfs";

printf("%d

",sky_strcmp(str_1,str));

printf("%d

",sky_strcmp(str_1,str_2));

return(0);

}

程序输出

0

1

--------------------------------

Processexitedafter0.02802secondswithreturnvalue0

请按任意键继续...

2、忽略大小写字符串比较

实现逻辑,在比较字符时可以将其统一转换为大写或小写,然后再进行比对即可,和正常对比无其他不同

#include"stdio.h"

#defineCONVERT(c)(((c)>='A'&&(c)<='Z')?((c)-'A'+'a'):(c))

intsky_strcmp(char*dst,char*str)

{

inti,len;

if(NULL==dst||NULL==str){

return0;

}

if(strlen(dst)!=strlen(str)){

return0;

}

len=strlen(dst);

for(i=0;iif(CONVERT(*dst)!=CONVERT(*str)){

return0;

}

dst++;

str++;

}

return1;

}

intmain(void)

{

charstr_1[100]="heLlo,world";

charstr_2[100]="hello,world";

charstr[100]="adfs";

printf("%d

",sky_strcmp(str_1,str));

printf("%d

",sky_strcmp(str_1,str_2));

return(0);

}

程序输出

0

1

--------------------------------

Processexitedafter0.04624secondswithreturnvalue0

请按任意键继续...

#memcpy函数实现

实现逻辑,主要就是逐个赋值即可完成

1、不考虑拷贝覆盖问题

#include"stdio.h"

#include"string.h"

void*sky_memecpy(void*dst,constvoid*str,intn)

{

if(NULL==dst||NULL==str||n<=0){

returnNULL;

}

char*pdst=(char*)dst;

char*pstr=(char*)str;

while(n--){

*pdst++=*pstr++;

}

returndst;

}

intmain(void)

{

charstr_1[100]="heLlo,world";

charstr_2[100]="sdfsdfs";

sky_memecpy(str_2,str_1,strlen(str_1));

printf("%s

",str_2);

return(0);

}

程序输出

heLlo,world

--------------------------------

Processexitedafter0.02516secondswithreturnvalue0

请按任意键继续...

2、考虑拷贝覆盖问题

拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,使用第二个函数就没有出现问题。

原因是,我们源字符串和目的字符串的地址都是一样的,我们希望把字符串往后移动一个位置,但是实际上出现了问题。

#include"stdio.h"

#include"string.h"

void*sky_memecpy_1(void*dst,constvoid*str,intn)

{

if(NULL==dst||NULL==str||n<=0){

returnNULL;

}

char*pdst=(char*)dst;

char*pstr=(char*)str;

while(n--){

*pdst++=*pstr++;

}

returndst;

}

void*sky_memecpy(void*dst,constvoid*str,intn)

{

if(NULL==dst||NULL==str||n<=0){

returnNULL;

}

char*pdst=(char*)dst;

char*pstr=(char*)str;

if(pdst>pstr&&pdstwhile(n--){

*pdst--=*pstr--;

}

}else{

while(n--){

*pdst++=*pstr++;

}

}

returndst;

}

intmain(void)

{

charstr_1[100]="heLlo,world";

charstr_2[100]="heLlo,world";

sky_memecpy_1(str_1+1,str_1,strlen(str_1));

printf("%s

",str_1);

sky_memecpy(str_2+1,str_2,strlen(str_2));

printf("%s

",str_2);

return(0);

}

程序输出

hhhhhhhhhhhh

hheLlo,world

--------------------------------

Processexitedafter0.02773secondswithreturnvalue0

请按任意键继续...

针对上面的拷贝覆盖问题,单独写了一个测试程序

#include"stdio.h"

#include"string.h"

void*sky_memecpy(void*dst,constvoid*str,intn)

{

if(NULL==dst||NULL==str||n<=0){

returnNULL;

}

char*pdst=(char*)dst;

char*pstr=(char*)str;

while(n--){

printf("dst:%c--->str:%c

",*pdst,*pstr);

*pdst++=*pstr++;

}

returndst;

}

intmain(void)

{

charstr_1[100]="heLlo,world";

sky_memecpy(str_1+1,str_1,strlen(str_1));

printf("%s

",str_1);

return(0);

}

程序输出

dst:e--->str:h

dst:L--->str:h

dst:l--->str:h

dst:o--->str:h

dst:,--->str:h

dst:w--->str:h

dst:o--->str:h

dst:r--->str:h

dst:l--->str:h

dst:d--->str:h

dst:--->str:h

hhhhhhhhhhhh

--------------------------------

Processexitedafter0.02575secondswithreturnvalue0

请按任意键继续...

初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。好了,就这些内容,希望大家好好消化,这些代码对面试很有帮助。

责任编辑:xj

原文标题:面试必备!常见的C语言字符串操作

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。