#字符串倒序輸出
實現邏輯,通過strlen獲取字符串長度,然后通過 len/2 進行交叉賦值,這里需要注意,不需要考慮len是奇數還是偶數的問題。
如果len是奇數,最后一個字符就不需要倒序,如果是偶數,最后兩個字符就倒序。
#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
請按任意鍵繼續...
#整型轉字符串
實現邏輯,每個整數看其轉換進制,從個位到十位百位都可以通過%操作加上/操作獲得,再用一個字符數組保存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&&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]='';
//翻轉
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
請按任意鍵繼續...
#字符串復制
實現邏輯,逐個賦值直到遇到''停止即可
#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】歡迎添加關注!文章轉載請注明出處。
-
嵌入式
+關注
關注
5068文章
19020瀏覽量
303317 -
C語言
+關注
關注
180文章
7598瀏覽量
136208 -
字符串
+關注
關注
1文章
577瀏覽量
20485
原文標題:面試必備!常見的C語言字符串操作
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論