【问题标题】:Substring C from string like folder1/file1.txt来自文件夹 1/file1.txt 等字符串的子字符串 C
【发布时间】:2011-01-10 19:33:17
【问题描述】:

我有像“folder1/file1.txt”或“foldername1/hello.txt”这样的字符串,我需要使用包含斜杠(/)标识文件夹名称的子字符串
(例如:来自“folder1 /file1.txt”我需要“文件夹 1/”)。
文件夹名称的长度不同。 我怎么能在C中做到这一点?谢谢

【问题讨论】:

    标签: c string substring substr


    【解决方案1】:

    首先,用strchr找到斜线的位置:

    char * f = "folder/foo.txt";  // or whatever
    char * pos = strchr( f, '/' );
    

    然后复制到合适的地方:

    char path[1000];   // or whatever
    strncpy( path, f, (pos - f) + 1 );
    path[(pos-f)+1] = 0;    // null terminate
    

    你真的应该写一个函数来做这个,你需要决定如果strchr()返回NULL,表明斜线不存在怎么办。

    【讨论】:

    • 您可能希望使用 strrchr() 从字符串末尾开始查找斜杠
    • 取决于他是想要路径中的第一个目录还是整个 shebang - 大多数操作系统都有执行后者的功能,所以我假设前者。
    【解决方案2】:

    找到最后一个'/'字符,前进一个字符然后截断字符串。假设字符串是可修改的,并且被char *filename;指向:

    char *p;
    
    p = strrchr(filename, '/');
    if (p)
    {
        p[1] = '\0';
    }
    
    /* filename now points to just the path */
    

    【讨论】:

      【解决方案3】:

      你可以使用 strstr() 函数:

      char *s = "folder1/file1.txt";
      char folder[100];
      
      char *p = strstr(s, "/");
      if (0 != p)
      {
          int len = p - s + 1;
          strncpy(folder, s, len);
          folder[len] = '\0';
          puts(folder);
      }
      

      【讨论】:

        【解决方案4】:

        如果您在 POSIX 机器上工作,您可以查找 dirname() 函数,它或多或少可以满足您的需求。有一些特殊情况,它处理的幼稚代码没有处理 - 但也要注意标准中的黄鼠狼字(关于修改输入字符串,可能返回一个指向输入字符串的指针,或者可能是一个指向可以修改的静态内存的指针稍后)。

        它 (dirname()) 不会保留您说需要的尾部斜杠。然而,这很少是一个实际问题。在目录名和文件之间添加斜线并不难。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-28
          • 1970-01-01
          • 1970-01-01
          • 2015-11-11
          相关资源
          最近更新 更多