【发布时间】:2014-11-17 19:19:51
【问题描述】:
我在 C 中有一个字符串(路径名),我需要从字符串中删除最后一个 /...。
例如:home/usr/bin/ls
想要的结果:home/usr/bin
老实说,我似乎想不出办法来做到这一点。我尝试了 strtok() 但这会将字符串从第一次出现的分隔符中拆分出来,我只需要在最后一次出现“/”后删除文本。如果有人有任何指向 C 中可以帮助我的方法的指针,我将不胜感激。
【问题讨论】:
我在 C 中有一个字符串(路径名),我需要从字符串中删除最后一个 /...。
例如:home/usr/bin/ls
想要的结果:home/usr/bin
老实说,我似乎想不出办法来做到这一点。我尝试了 strtok() 但这会将字符串从第一次出现的分隔符中拆分出来,我只需要在最后一次出现“/”后删除文本。如果有人有任何指向 C 中可以帮助我的方法的指针,我将不胜感激。
【问题讨论】:
使用strrchr。
这里最大字符串长度为 50 字节。
int main()
{
char s1[50];
printf("enter your string\n");
fgets(s1, 50, stdin);
char *p;
p=strrchr(s1, '/');
if(p)
*p='\0';
printf("output is %s\n",s1);
return 0;
}
【讨论】:
fgets 之前不需要memset 2) 你不检查p 是否为NULL
strrchr 找到最后一次出现,+1 因为我现在没有这个功能是标准的一部分
循环strtok直到找不到更多的/,然后在之前找到的/处拆分
或者,在这种特殊情况下,尝试使用 dirname() 函数
【讨论】:
有很多很多方法可以做到这一点。最简单的方法之一是使用strrchr 查找路径中最后出现的'/' 并将其设置为null(即,将其设为新的end of string):
#include <stdio.h>
#include <string.h>
int main () {
char mypath[] = "home/usr/bin/ls";
char *p = strrchr (mypath, '/'); /* find last '/' in mypath */
*p = 0; /* set as null-termination */
printf ("\n mypath : %s\n\n", mypath); /* print it */
return 0;
}
输出:
$ ./bin/trimpath
mypath : home/usr/bin
另一种方法是找到mypath的长度(即size_t len = strlen (mypath);),然后使用指针,递减指针mypath + len -1直到找到/并将/设置为null:
char *p = (mypath + strlen (mypath) - 1);
while (p > mypath)
{
if (*p == '/') {
*p = 0;
break;
}
p--;
}
【讨论】: