【问题标题】:Split string at last specified occurence of "special" sign + C在最后指定的“特殊”符号出现处拆分字符串 + C
【发布时间】:2014-11-17 19:19:51
【问题描述】:

我在 C 中有一个字符串(路径名),我需要从字符串中删除最后一个 /...。

例如:home/usr/bin/ls

想要的结果:home/usr/bin

老实说,我似乎想不出办法来做到这一点。我尝试了 strtok() 但这会将字符串从第一次出现的分隔符中拆分出来,我只需要在最后一次出现“/”后删除文本。如果有人有任何指向 C 中可以帮助我的方法的指针,我将不胜感激。

【问题讨论】:

    标签: c string split


    【解决方案1】:

    使用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;
    }
    

    【讨论】:

    • 1) 在fgets 之前不需要memset 2) 你不检查p 是否为NULL
    • 感谢@Alter Mann 指出这里....但我要删除最后一个...使用 strrchr
    • 是的,对不起,strrchr 找到最后一次出现,+1 因为我现在没有这个功能是标准的一部分
    • 工作就像一个魅力!仍然想知道人们是如何知道所有这些智能功能的;)
    【解决方案2】:

    循环strtok直到找不到更多的/,然后在之前找到的/处拆分

    或者,在这种特殊情况下,尝试使用 dirname() 函数

    【讨论】:

      【解决方案3】:

      有很多很多方法可以做到这一点。最简单的方法之一是使用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--;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2019-01-06
        • 1970-01-01
        相关资源
        最近更新 更多