1. 程式人生 > >函式實現 -- 分割字串,並獲取最後一段字串

函式實現 -- 分割字串,並獲取最後一段字串

在寫myshell的時候, 發現系統shell會顯示當前目錄, 也想實現這樣的效果, 但是我只找到了一個函式

char *getcwd( char *buffer, int maxlen );
//功 能:獲取當前工作目錄
//引數說明:getcwd()會將當前工作目錄的絕對路徑複製到引數buffer所指的記憶體空間中
//引數maxlen為buffer的空間大小。
//返 回 值:成功則返回當前工作目錄,失敗返回 FALSE。

它只能獲取當前工作目錄的絕對路徑, 絕對路徑太長了, 我想要shell顯示的這樣
這裡寫圖片描述
只顯示當前目錄, 就想有沒有辦法只獲取最後的一段目錄

想到一個函式

char *strncpy
(char *dest, const char *src, int n); //把src所指向的字串中以src地址開始的前n個位元組複製到dest所指的陣列中 //並返回dest。

但是他只能複製前 n 個位元組啊

/home/rjm/Study/Linux/myshell

我發現, 絕對路徑是這樣的, 他們以 / 為分隔符
想到一個函式, 可以分割字串

char *strtok(char s[], const char *delim);

//分解字串為一組字串。s為要分解的字串,delim為分隔符字串。
//例如:strtok("abc,def,ghi",","),最後可以分割成為abc def ghi
//尤其在點分十進位制的IP中提取應用較多。
//如果s為空值NULL,則函式儲存的指標SAVE_PTR在下一次呼叫中將作為起始位置 //也就是說,在第一次呼叫時,strtok()必需給予引數s字串 //往後的呼叫則將引數s設定成NULL

於是可以把這個絕對路徑以 / 分割成一段段字串, 然後取最後一段就可以了
那麼怎麼才能取到最後一段呢?
我們可以定義一個二維陣列, 儲存分割的字串, 然後只取最後一個數組中的字串

函式實現程式碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define ROW 100 #define COL 100 char *cutOut(char str[], const char *delim, char **catalog) { char *result = NULL; //char *strtok(char s[], const char *delim); result = strtok( str, delim ); char msg[ROW][COL]; int i = 0; for(i = 0; result != NULL; i++) { strcpy(msg[i], result); //printf("msg[%d] = %s", i, msg[i]); //printf("\n"); result = strtok( NULL, delim ); } *catalog = msg[i - 1]; //printf("catalog = %s\n", *catalog); return *catalog; } //用法 void useAge() { char *msg = (char *)malloc(100); //char *getcwd(char *buf, size_t size); //作用:把當前目錄的絕對地址儲存到 buf 中,buf 的大小為 size。 //如果 size 太小無法儲存該地址,返回 NULL 並設定 errno 為 ERANGE。 //可以採取令 buf 為 NULL並使 size 為 0 來使 getcwd 呼叫 malloc 動態給 buf 分配 //但是這種情況要特別注意使用後釋放緩衝以防止記憶體洩漏。 getcwd(msg, 100); printf("msg = %s\n", msg); char delim[] = "/"; char *catalog; cutOut(msg, delim, &catalog); printf("catalog = %s\n", catalog); free(msg); } int main() { useAge(); }

這裡寫圖片描述

於是乎, myshell就可以以假亂真啦
這裡寫圖片描述
你能看出哪個才是我的 myshell 嗎? 哈哈哈