C语言中的Unix路径解析

C语言中的Unix路径解析,c,unix,path,C,Unix,Path,我目前在上操作系统课。我们的一个项目涉及创建一个简单的shell。这涉及到解析行和解析路径。所以我需要考虑一些事情,比如~…/等现在我正试图想出一个代码来轻松解析“.”——父目录 这是到目前为止我的代码。我的目标是定位..的出现,然后保存字符串的后半部分(如果有),然后删除。。以及它之前的第二个“/”。例如,我们有: /1/2/3/../../4/5/6 我的目标是,在…的第一个位置。。保存/。/4/5/6 然后保存1/2并连接。 然后它会找到下一个。。并将/4/5/6保存到下半场 上半场应该可

我目前在上操作系统课。我们的一个项目涉及创建一个简单的shell。这涉及到解析行和解析路径。所以我需要考虑一些事情,比如~…/等现在我正试图想出一个代码来轻松解析“.”——父目录

这是到目前为止我的代码。我的目标是定位..的出现,然后保存字符串的后半部分(如果有),然后删除。。以及它之前的第二个“/”。例如,我们有: /1/2/3/../../4/5/6 我的目标是,在…的第一个位置。。保存/。/4/5/6 然后保存1/2并连接。 然后它会找到下一个。。并将/4/5/6保存到下半场 上半场应该可以节省/1

void expandParentDirectory (){

char firstHalf[ 255 ];
char secondHalf[ 255 ];

for( int i = 1; i < tokenSize; i++ ){

    // checking token list for appearance of ".."
    ////// tests
    size_t len = strlen(parsedArguments[i]);
    printf("string length is: %lu \n", len);

    for(int j = 0; j < strlen(parsedArguments[i]); ++j){
        if(parsedArguments[ i ][ j ] == '.' )
            if(parsedArguments[ i ][ j + 1 ] == '.' ){

                if(parsedArguments[ i ][ j + 2 ] != '\0' ){
                    strcpy(secondHalf, &parsedArguments[ i ] [ j + 2 ]);
                }
                // code to expand PWD and move up a directory
                // if (j == 0) {}

                for (int k = j - 2 ; k > 0 ; k--) {
                    if( parsedArguments[ i ][ k ] == '/' ){
                        strncpy( firstHalf, parsedArguments[ i ], k );
                        //firstHalf[ k ] = '\0';

                        free ( parsedArguments[ i ]);
                        parsedArguments[ i ] = strdup( strcat( firstHalf, secondHalf
                    }
                }
                 ));


            }
    }
}
}
void expandParentDirectory(){
字符前半部分[255];
半焦[255];
for(int i=1;i0;k--){
if(parsedArguments[i][k]=='/'){
strncpy(上半部分,parsedArguments[i],k);
//前半部分[k]='\0';
自由(帕斯达古门特[i]);
parsedArguments[i]=strdup(strcat(上半部分,下半部分
}
}
));
}
}
}
}
有什么建议可以让它正常工作吗? 对更好的方法有什么建议吗?
谢谢

库函数
realpath
将为您实现这一点:

尽管realpath()很漂亮(或者我猜是因为它),但我无法在代码中使用它。我必须自己做工作。这就是我想到的。它工作得相当好,但决不是完美的。我不确定是这段代码还是调用它的代码,但是当我反复设置目录或调用某个东西时,会遇到很多错误。。在里面。除了这些问题,我也很喜欢

char * pathResolution ( char * path ){

char * specialDirectory[ 3 ] = { ".", "..", "~" };
char * currentPath = getenv( "PWD" );
char * pathTokens[ 50 ];

int pathTokenCount = 0;
int action = -1;

// if it is just "/", no checks needed
if( !strcmp( "/", path) ){
    return path;
}

// get each path token between '/'
for ( path = strtok( path, "/" ); path;
     path = strtok( NULL, "/" )) {
    pathTokens[ pathTokenCount++ ] = path;
}

// check for special characters
for( size_t i = 0; i != pathTokenCount; ++i ) {

    // checks for special characters; sets action
    if( !strcmp( specialDirectory[ 0 ], pathTokens[ i ]) ){ action = 1; }
    else if( !strcmp( specialDirectory[ 1 ], pathTokens[ i ]) ){ action = 1; }
    else if( !strcmp( specialDirectory[ 2 ], pathTokens[ i ]) ){ action = 2; }
    else { action = 3; }

    // action depending on character
    switch( action ){

        case 1:{ // ".."

            int index;
            char * lastSlash = strrchr( currentPath, '/' );
            index = ( int )( lastSlash - currentPath );
            currentPath[ index ] = '\0';

            if( strlen( currentPath ) < 1 ){
                currentPath = "/";
            }
            break;
        }

        case 2: { // "~"

            // ~ can only be first, return null otherwise
            if( i == 0 ){
                currentPath = getenv( "HOME" );
                break;
            }
            else
                return NULL;
        }

        case 3: {

            // appends /text to end of PWD: PWD/...text...
            char buffer[ 255 ];
            if( !strcmp( "/", currentPath) )
                sprintf( buffer, "/%s", pathTokens[ i ] );
            else
                sprintf( buffer, "%s/%s", currentPath, pathTokens[ i ] );

            currentPath = buffer;
            break;
        }

        default:
            break;

    }
}

return currentPath;

}
char*path解析(char*path){
char*specialDirectory[3]={“.”,“…”,“~”};
char*currentPath=getenv(“PWD”);
char*pathTokens[50];
int-pathTokenCount=0;
int action=-1;
//如果只是“/”,则不需要检查
如果(!strcmp(“/”,路径)){
返回路径;
}
//获取“/”之间的每个路径标记
对于(path=strtok(path,“/”;path;
path=strtok(空,“/”){
pathTokens[pathTokenCount++]=path;
}
//检查特殊字符
对于(大小i=0;i!=pathTokenCount;++i){
//检查特殊字符;设置操作
如果(!strcmp(specialDirectory[0],pathTokens[i]){action=1;}
else如果(!strcmp(specialDirectory[1],pathTokens[i]){action=1;}
else如果(!strcmp(specialDirectory[2],pathTokens[i]){action=2;}
else{action=3;}
//动作取决于角色
开关(动作){
案例1:{//”
整数指数;
char*lastsslash=strrchr(当前路径“/”);
索引=(int)(最后斜杠-当前路径);
当前路径[索引]='\0';
if(strlen(currentPath)<1){
currentPath=“/”;
}
打破
}
案例2:{/“~”
//~只能是第一个,否则返回null
如果(i==0){
currentPath=getenv(“主页”);
打破
}
其他的
返回NULL;
}
案例3:{
//在PWD的末尾追加/text:PWD/…text。。。
字符缓冲区[255];
如果(!strcmp(“/”,currentPath))
sprintf(缓冲区“/%s”,路径令牌[i]);
其他的
sprintf(缓冲区,“%s/%s”、currentPath、pathTokens[i]);
currentPath=缓冲区;
打破
}
违约:
打破
}
}
返回电流路径;
}

是的,
realpath
将以某种方式完成这项工作,但这显然不是练习。
realpath
函数还解析符号链接,而此代码不解析符号链接;它正在执行纯文本的“路径解析”。@JonathanLeffler-这是来自Solaris 11上realpath的手册页:realpath()函数从文件名指向的路径名派生出一个命名同一文件的绝对路径名,其解析不涉及“.”“…”或符号链接。生成的路径名作为以null结尾的字符串存储在解析的路径名所指向的缓冲区中,最大值为{PATH_MAX}字节(在limits.h(3HEAD)中定义)请注意,它不解析符号links@jimmcnamara:au contaire:它清楚地表明,结果路径不涉及符号链接,即使输入确实穿过符号链接-请参阅您引用的文本。您知道,我相信我的类(操作系统)的目标是了解操作系统的核心功能是如何工作的。我不确定realpath是否会违反这一点。我不知道这个功能,并将研究它。如果结果是好的,我会接受你的回答。同时,使用strstr(也不知道(不太熟悉c))的建议非常有益。欢迎使用Stack Overflow。请尽快阅读这一页。你应该发布可编译的代码;由于
),您发布的内容显然无法编译位于最里面的
for
循环之后。您的
strdup(strcat(