Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:如何尽可能高效地搜索字符的最后一次出现_C - Fatal编程技术网

C:如何尽可能高效地搜索字符的最后一次出现

C:如何尽可能高效地搜索字符的最后一次出现,c,C,我需要尽可能快地找到角色的最后一次出现(如果有)。字符串的总长度未知,但最大长度已知 考虑以下示例: char cwd[PATH_MAX]; // this can have up to PATH_MAX chars (e.g. 1024) 字符串可能像/Users/leon/Downloads/program\u a/bin64,我想找到最后一个/,这样我就可以返回/bin64 我当前的解决方案: #include <unistd.h> #include <stdio.h&

我需要尽可能快地找到角色的最后一次出现(如果有)。字符串的总长度未知,但最大长度已知

考虑以下示例:

char cwd[PATH_MAX]; // this can have up to PATH_MAX chars (e.g. 1024)
字符串可能像
/Users/leon/Downloads/program\u a/bin64
,我想找到最后一个
/
,这样我就可以返回
/bin64

我当前的解决方案:

#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>

int main()
{
    char cwd[PATH_MAX];
    if (getcwd(cwd, sizeof(cwd)) == NULL)
    {
        perror("getcwd() error");
    }

    char *pch;
    char *last = cwd;
    pch = strchr(cwd, '/');
    while (1)
    {
        pch = strchr(pch + 1, '/');
        if (pch == NULL)
        {
            break;
        }
        last = pch;
    }


    printf("%s\n", last);
    return 0;
}
#包括
#包括
#包括
#包括
int main()
{
char cwd[PATH_MAX];
if(getcwd(cwd,sizeof(cwd))==NULL)
{
perror(“getcwd()错误”);
}
char*pch;
char*last=cwd;
pch=strchr(cwd,“/”);
而(1)
{
pch=strchr(pch+1’/);
如果(pch==NULL)
{
打破
}
last=pch;
}
printf(“%s\n”,最后一个);
返回0;
}

这是可行的,但它必须始终遍历整个路径。有更好的方法吗?

< P>你是否考虑跟踪当前目录在shell中的某个地方? 通常,您需要某种内置的
cd
实现。 理想情况下,您只需更新当前文件夹(存储在某个变量的某处),并在每次调用
cd
时更新它

当然,您需要处理特殊情况,如
cd..
cd~
。但归根结底,这应该更有效率。

简化版:


#包括
#包括
#包括
#包括
int main()
{
char-cwd[PATH_MAX]={0,};
char*last=NULL;
未签名pos;
如果(!getcwd(cwd,cwd的大小))
{
perror(“getcwd()错误”);
}
用于(pos=0;cwd[pos];pos++){
如果(cwd[pos]=='/')最后一次=cwd+pos;
}
printf(“%s\n”,last?last:“Null”);
返回0;
}

一个简单的改进是从末尾而不是从开头遍历。使用标准函数,但我不知道字符串在哪里终止。我只知道PATH_MAX,它在大多数情况下比路径本身大得多。看起来原始linux系统调用会告诉您长度(与POSIXAPI不同)。然后你可以使用
memrchr
(也是非标准的,但是当标准很糟糕的时候你能做些什么?。@Someprogrammerdude,你认为
strrchr
是如何实现的?不可能从末尾开始,因为零结尾的结尾事先不知道。我同意使用
strrchr
将是一种改进,但这只是因为我认为使用标准函数比重新发明轮子更好,而且因为我认为标准库例程可能比本机C实现优化得更好。不是因为它是从末端穿过的。这似乎是一个很好的方法。我一定会落实。但在某些情况下,我仍然需要一种快速查找当前文件夹的方法,例如,首先运行order
cd..
。请注意,
peror()
不会退出,因此在诊断故障后,代码在使用未初始化的数组时出错。我希望保留尽可能多的原始逻辑。(同样使用较小的缓冲区大小进行测试,循环将找不到
“/”
;-)
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <unistd.h>

int main()
{
    char cwd[PATH_MAX] = {0,};
    char *last = NULL;
    unsigned pos;

    if (!getcwd(cwd, sizeof cwd) )
    {
        perror("getcwd() error");
    }

    for(pos=0; cwd[pos]; pos++) {
        if (cwd[pos] == '/') last = cwd+pos;
        }

    printf("%s\n", last? last: "Null" );
    return 0;
}