衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

#字符串倒序輸出

實現邏輯,通過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&&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】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307665
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137712
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20603

原文標題:面試必備!常見的C語言字符串操作

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    字符串在數據庫中的存儲方式

    數據庫是現代信息技術中存儲和管理數據的核心組件。字符串作為最常見的數據類型之,在數據庫中的存儲方式對其性能和可擴展性有著重要影響。 數據類型 固定長度字符串 :如CHAR類型,它為每
    的頭像 發表于 01-07 15:41 ?189次閱讀

    字符串在編程中的應用實例

    字符串在編程中有著廣泛的應用,它們被用于表示文本數據、處理用戶輸入、構建動態內容等。以下是一些字符串在編程中的應用實例: 1. 用戶輸入與輸出 用戶輸入 :程序通常需要從用戶那里獲取輸入,這些輸入通
    的頭像 發表于 01-07 15:33 ?150次閱讀

    字符串字符數組的區別

    在編程語言中,字符串字符數組是兩種基本的數據結構,它們都用于存儲和處理文本數據。盡管它們在功能上有定的重疊,但在內部表示、操作方式和使用
    的頭像 發表于 01-07 15:29 ?293次閱讀

    字符串反轉的實現方式

    在編程中,字符串反轉是個基礎而重要的操作,它涉及到將一個字符串中的字符順序顛倒過來。這個操作
    的頭像 發表于 01-07 15:27 ?205次閱讀

    字符串處理方法 字符串轉數字的實現

    在編程中,將字符串轉換為數字是常見的需求。不同的編程語言有不同的方法來實現這功能。以下是一些
    的頭像 發表于 01-07 15:26 ?187次閱讀

    base64字符串轉換為二進制文件

    一些編程知識。以下是將Base64字符串轉換為二進制文件的般步驟,以及個簡單的Python示例代碼。 步驟: 獲取Base64字符串
    的頭像 發表于 11-10 10:55 ?1632次閱讀

    MATLAB(5)--字符串處理

    字符串表示 在MATLAB中,字符串是用單引號括起來的字符序列,是把一個字符串當做個行向量,這個行向量中,每個元素對應
    發表于 09-06 10:22

    labview字符串數組轉化為數值數組

    在LabVIEW中,將字符串數組轉換為數值數組是常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW中的數據類型是非
    的頭像 發表于 09-04 17:47 ?2840次閱讀

    labview字符串如何轉換為16進制字符串

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

    labview中如何實現字符串換行

    2.1 使用內置函數 LabVIEW提供了多種內置函數來處理字符串,包括換行。以下是一些常用的方法: 使用 Build Array 函數 :通過循環構建字符串數組,每個元素代表
    的頭像 發表于 09-04 15:47 ?2023次閱讀

    labview中如何實現字符串選擇輸出

    在LabVIEW中實現字符串選擇輸出是常見的任務,它涉及到字符串處理、條件判斷和用戶界面設計等多個方面。由于LabVIEW是種圖形化編
    的頭像 發表于 09-04 15:44 ?1083次閱讀

    labview中常用的字符串函數有哪些?

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

    labview字符串的四種表示各有什么特點

    。在LabVIEW中,字符串種基本的數據類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應用場景和特點。以下是對LabVIEW中四種字符串表示方
    的頭像 發表于 09-04 15:40 ?706次閱讀

    鴻蒙TypeScript學習第10天:【String(字符串)】

    String 對象用于處理文本(字符串)。
    的頭像 發表于 04-08 14:32 ?888次閱讀
    鴻蒙TypeScript學習第10天:【String(<b class='flag-5'>字符串</b>)】

    C語言字符串編譯函數介紹

    C語言中,字符串實際上是使用null字符O'終止的字符數組。因此,
    的頭像 發表于 03-07 16:18 ?555次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>字符串</b>編譯函數介紹
    百家乐真人游戏网上投注 | 百家乐投注玩多少钱| 现场百家乐官网平台源码| 大发888注册送| 百家乐龙虎斗等| 罗马百家乐官网的玩法技巧和规则 | 福鼎市| 大发888娱乐城网页版lm0| 百家乐棋牌技巧| 百家乐官网赌场技巧论坛| 百家乐代理合作| 水果机价格| 百家乐赌场高手| 百家乐官网专打单跳投注法| 安徽棋牌游戏中心| 竞咪百家乐官网的玩法技巧和规则 | 百家乐这样赢保单分析 | 百家乐赌局| 百家乐官网园有限公司| 百家乐官网学院| 百家乐官网庄的概率| tt娱乐城网址| 全讯网3| 百家乐的巧门| 功夫百家乐官网的玩法技巧和规则 | 足球系统出租| 天津太阳城橙翠园| 路单百家乐的玩法技巧和规则 | 百家乐官网在线投注网| 贵定县| 现金网系统出租| 百家乐必胜方法如果你还想继续不看可能后悔一生 | 希尔顿百家乐官网试玩| 百家乐官网最长的闲| E乐博百家乐| 大发888娱乐城账号| 威尼斯人娱乐网网址| 百家乐国际娱乐场开户注册| 澳门百家乐棋牌游戏| 川宜百家乐破解版| 百家乐官网套利|