#字符串倒序輸出
實(shí)現(xiàn)邏輯,通過strlen獲取字符串長度,然后通過 len/2 進(jìn)行交叉賦值,這里需要注意,不需要考慮len是奇數(shù)還是偶數(shù)的問題。
如果len是奇數(shù),最后一個字符就不需要倒序,如果是偶數(shù),最后兩個字符就倒序。
#include"stdio.h"
voidrechange_str(char*str)
{
inti,len;
chartmp;
if(NULL==str){
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
請按任意鍵繼續(xù)...
#整型轉(zhuǎn)字符串
實(shí)現(xiàn)邏輯,每個整數(shù)看其轉(zhuǎn)換進(jìn)制,從個位到十位百位都可以通過%操作加上/操作獲得,再用一個字符數(shù)組保存0-F。
用個位數(shù)對應(yīng)值轉(zhuǎn)為字符,注意轉(zhuǎn)換出的字符串是反向的,還要考慮傳入的若是負(fù)數(shù)如何處理,再用翻轉(zhuǎn)字符串完成最后整個操作
下面這段代碼需要好好研究一下,最好自己運(yùn)行試試。
#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&&value0)?{
??tmp_value?=?(unsigned?int)(0?-?value);
??str[i++]?=?'-';
k=1;
}else{
tmp_value=(unsignedint)value;
}
do{
str[i++]=list[tmp_value%radix];
tmp_value/=radix;
}while(tmp_value);
str[i]='';
//翻轉(zhuǎn)
chartmp;
for(j=k;j(i+k)/2;?j++)?{
??tmp?=?str[j];
??str[j]?=?str[i+k-j-1];
??str[i+k-j-1]?=?tmp;
?}
?returnstr;
}
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
請按任意鍵繼續(xù)...
#字符串復(fù)制
實(shí)現(xiàn)邏輯,逐個賦值直到遇到''停止即可
#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
請按任意鍵繼續(xù)...
#字符串比較
1、正常比較是否相同 實(shí)現(xiàn)邏輯,判斷字符串長度是否相同,若相同逐個比較字符是否相同
#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
請按任意鍵繼續(xù)...
2、忽略大小寫字符串比較
實(shí)現(xiàn)邏輯,在比較字符時可以將其統(tǒng)一轉(zhuǎn)換為大寫或小寫,然后再進(jìn)行比對即可,和正常對比無其他不同
#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
請按任意鍵繼續(xù)...
#memcpy函數(shù)實(shí)現(xiàn)
實(shí)現(xiàn)邏輯,主要就是逐個賦值即可完成
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
請按任意鍵繼續(xù)...
2、考慮拷貝覆蓋問題
拷貝覆蓋是我們在拷貝字符串的時候需要注意的一個問題,我下面的示例程序,使用第一個函數(shù)的時候,就出現(xiàn)了問題,使用第二個函數(shù)就沒有出現(xiàn)問題。
原因是,我們源字符串和目的字符串的地址都是一樣的,我們希望把字符串往后移動一個位置,但是實(shí)際上出現(xiàn)了問題。
#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
請按任意鍵繼續(xù)...
針對上面的拷貝覆蓋問題,單獨(dú)寫了一個測試程序
#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
請按任意鍵繼續(xù)...
初始的時候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移動,str再移動,就出現(xiàn)了dst被h字符所覆蓋。好了,就這些內(nèi)容,希望大家好好消化,這些代碼對面試很有幫助。
責(zé)任編輯:xj原文標(biāo)題:面試必備!常見的C語言字符串操作
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
嵌入式
+關(guān)注
關(guān)注
5056文章
18962瀏覽量
301783 -
C語言
+關(guān)注
關(guān)注
180文章
7591瀏覽量
135780 -
字符串
+關(guān)注
關(guān)注
1文章
570瀏覽量
20464
原文標(biāo)題:面試必備!常見的C語言字符串操作
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論