函式實現 -- 分割字串,並獲取最後一段字串
阿新 • • 發佈:2019-01-27
在寫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 嗎? 哈哈哈