0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一些常見的C語言字符串操作

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:嵌入式Linux ? 2020-12-24 16:31 ? 次閱讀

#字符串倒序輸出

實(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&&value'-';
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;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
請按任意鍵繼續(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)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(liá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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串

    Instrument)以及利用第三方工具。 1. 使用內(nèi)置函數(shù) LabVIEW提供了一些內(nèi)置函數(shù),可以直接將字符串轉(zhuǎn)換為16進(jìn)制字符串。這些函數(shù)通常位于“編程”->“字符串”->“轉(zhuǎn)
    的頭像 發(fā)表于 09-04 15:54 ?1424次閱讀

    labview中常用的字符串函數(shù)有哪些?

    在LabVIEW中,常用的字符串函數(shù)廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串
    的頭像 發(fā)表于 09-04 15:43 ?411次閱讀

    C語言字符串編譯函數(shù)介紹

    C語言中,字符串實(shí)際上是使用null字符O'終止的字符數(shù)組。因此,
    的頭像 發(fā)表于 03-07 16:18 ?455次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>字符串</b>編譯函數(shù)介紹

    labview掃描字符串怎么用

    LabVIEW 是種流程化編程語言和開發(fā)環(huán)境,主要用于控制、測量和監(jiān)測系統(tǒng)。在 LabVIEW 中,掃描字符串項(xiàng)常見的任務(wù),它允許用戶
    的頭像 發(fā)表于 12-29 10:12 ?1773次閱讀

    labview掃描字符串怎么用

    LabVIEW是種圖形化編程語言,用于開發(fā)控制、測量和監(jiān)控系統(tǒng)。雖然它主要用于工程和科學(xué)領(lǐng)域,但也可以用于處理文本和字符串。 在LabVIEW中,可以使用字符串處理函數(shù)來掃描
    的頭像 發(fā)表于 12-26 16:58 ?1779次閱讀

    labview中怎么對字符串中的進(jìn)行實(shí)時處理

    LabVIEW是種用于開發(fā)控制、測試和測量系統(tǒng)的可視化編程環(huán)境,它提供了許多處理字符串的功能。在LabVIEW中,可以使用不同的函數(shù)和工具來實(shí)時處理字符串。下面我將詳細(xì)介紹一些
    的頭像 發(fā)表于 12-26 14:12 ?1639次閱讀

    oracle字符串split成多個

    Oracle是種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了許多強(qiáng)大的功能和函數(shù),用于處理和操作數(shù)據(jù)。其中之就是字符串分割(split)方法,該方法用于將
    的頭像 發(fā)表于 12-06 09:54 ?5002次閱讀

    oracle中拼接字符串函數(shù)

    , string2) 其中,string1 和 string2 是需要連接的字符串參數(shù)。 除了 CONCAT 函數(shù),Oracle 還提供了一些其他的字符串拼接函數(shù)和操作符,這些函數(shù)和
    的頭像 發(fā)表于 12-06 09:49 ?2744次閱讀

    MySQL替換字符串函數(shù)REPLACE

    MySQL是目前非常流行的開源數(shù)據(jù)庫管理系統(tǒng)之,它具有強(qiáng)大的功能和性能。其中之字符串函數(shù)REPLACE,可以用于替換字符串中的指定字符
    的頭像 發(fā)表于 11-30 10:44 ?1419次閱讀

    c語言怎么用scanf輸入字符串

    C語言中,我們可以使用scanf函數(shù)來接收用戶的輸入。scanf函數(shù)有很多種用法,其中種用法就是用來接收字符串。 要接收字符串,我們可以
    的頭像 發(fā)表于 11-24 10:03 ?2437次閱讀

    c語言字符串定義

    字符串的定義、初始化、操作常見問題。 字符串的定義和初始化 在C語言中,
    的頭像 發(fā)表于 11-24 10:02 ?1730次閱讀

    python怎么把字符串變成數(shù)字

    計算中的值。在一些應(yīng)用場景中,需要將字符串轉(zhuǎn)換為數(shù)字,以便進(jìn)行數(shù)值計算、條件判斷或數(shù)據(jù)處理等操作。在本文中,我們將詳細(xì)探討Python中字符串到數(shù)字的轉(zhuǎn)換方法,并討論其在實(shí)際應(yīng)用中的
    的頭像 發(fā)表于 11-22 09:47 ?3563次閱讀

    java字符串轉(zhuǎn)化為日期格式

    ,并提供了一些常見的示例。 首先,我們需要明確日期的格式。在Java中,日期格式通常使用個模式字符串來表示。模式字符串
    的頭像 發(fā)表于 11-17 16:38 ?2766次閱讀

    字符串如何轉(zhuǎn)換成日期型

    同編程語言字符串轉(zhuǎn)換為日期類型。 正文: 、Python中的字符串轉(zhuǎn)日期轉(zhuǎn)換 在Python中,使用datetime模塊可以方便地將字符串
    的頭像 發(fā)表于 11-17 16:27 ?9801次閱讀

    mysql字符串包含某個字符串

    MySQL是種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),被廣泛用于構(gòu)建Web應(yīng)用程序和其他大型數(shù)據(jù)驅(qū)動的應(yīng)用。在進(jìn)行MySQL數(shù)據(jù)庫查詢時,經(jīng)常需要使用字符串包含操作,即判斷一個字符串是否包含另
    的頭像 發(fā)表于 11-16 14:52 ?3547次閱讀