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实现优化得更好。不是因为它是从末端穿过的。这似乎是一个很好的方法。我一定会落实。但在某些情况下,我仍然需要一种快速查找当前文件夹的方法,例如,首先运行ordercd..
。请注意,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;
}