函数实现 -- 分割字符串,并获取最后一段字符串

在写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 吗? 哈哈哈

猜你喜欢

转载自blog.csdn.net/sinat_36629696/article/details/80141445