c語言中字符串分割函數(shù)及實(shí)現(xiàn)方法
1、問題引入
自己在寫一個(gè)linux下的模擬執(zhí)行指令的時(shí)候,遇到了輸入"cat a.c”,要將該字符串分解成cat和a.c兩個(gè)單獨(dú)的字符串,雖然知道有strtok的存在,但是想自己嘗試寫一下,于是就自己寫了一個(gè),不過總是遇到這樣或那樣的問題,雖然最后調(diào)通了,不過確浪費(fèi)了不少時(shí)間;后來作業(yè)交上去以后又仔細(xì)閱讀了strtok函數(shù),發(fā)現(xiàn)原來linux下已經(jīng)改成strsep,所有在這里就寫一下自己所走的過程。
2、自己寫的字符串分割函數(shù):用于分割指令,比如cat a.c最后會(huì)被分割成cat和a.c兩個(gè)字符串、mv a.c b.c最后會(huì)被分割成mv和a.c和b.c三個(gè)字符串。
具體實(shí)現(xiàn)如下:
#include <stdio.h>
#include<string.h>
#define MAX_LEN 128
void main()
{
int i,length,ct=0,start = -1;
char inputBuffer[MAX_LEN],*args[MAX_LEN];
strcpy(inputBuffer,"mv a.c b.c");
length=strlen(inputBuffer);
for (i = 0; i <= length; i++) {
switch (inputBuffer[i]){
case ' ':
case '\t' : /* argument separators */
if(start != -1){
args[ct] = &inputBuffer[start]; /* set up pointer */
ct++;
}
inputBuffer[i] = '\0'; /* add a null char; make a C string */
start = -1;
break;
case '\0': /* should be the final char examined */
if (start != -1){
args[ct] = &inputBuffer[start];
ct++;
}
inputBuffer[i] = '\0';
args[ct] = NULL; /* no more arguments to this command */
break;
default : /* some other character */
if (start == -1)
start = i;
}
}
printf("分解之后的字符串為:\n");
for(i=0;i<ct;i++)
printf("%s \n",args[i]);
}
3、作業(yè)提交后又查詢了strtok,發(fā)現(xiàn)使用strtok函數(shù)會(huì)方便很多
具體示例如下:
#include <stdio.h>
#include<string.h>
int main()
{
char str[] = "mv a.c b.c";
char *p;
p = strtok(str, " ");
while(p)
{
printf("%s\n", p);
p = strtok(NULL, " ");
}
return 0;
}
4、在linux2.6.29以后的版本中,strtok被strsep代替了。
具體示例如下:
#include <stdio.h>
#include<string.h>
int main()
{
char str[] = "mv a.c b.c";
char *p;
char *buff;
buff=str;
p = strsep(&buff, " ");
while(p)
{
printf("%s\n", p);
p = strsep(&buff, " ");
}
return 0;
}
而且在我自己的電腦的linux中的codeblog下,運(yùn)行4中代碼需要0.029s,而運(yùn)行3中的代碼需要0.044s,說明strsep速度確實(shí)比strtok快一些。
以上這篇c語言中字符串分割函數(shù)及實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
C語言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享
這篇文章主要為大家詳細(xì)介紹了如何錄音C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)易的通訊錄(靜態(tài)版本),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-10-10
詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0
這篇文章主要介紹了詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C語言 詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊2022-03-03
visual studio 2019工具里添加開發(fā)中命令提示符的方法
這篇文章主要介紹了visual studio 2019工具里添加開發(fā)中命令提示符的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

