首页 > 解决方案 > C strtok() 没有正确标记?

问题描述

我一直在尝试解决这个问题,但我完全不知道如何解决这个问题。我有一个相当大的项目,我无数次使用 strtok 没有任何问题,但它在这里不起作用。请帮忙 :(

编辑:我正在寻找前缀删除而不是 strtok。如果有人对此感到困惑并在谷歌上搜索,我将把它留在这里。

这是有问题的代码:

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

int main()
{
   char root[1000]; 
   char home[1000];

   strcpy(root,"/Users/me/Desktop/my-project"); // this is working
   strcpy(home,"/Users/me/Desktop/my-project/home"); // this is working

   strtok(home,root); // here's the problem

   printf("%s",home);
}

结果1:

/Users/me/Desktop/my-project/h

我也试过:

char *ptr = strtok(home,root);

printf("%s",ptr);

结果 2:

h

不应该都回来/home吗?

标签: carraysstringtokenstrtok

解决方案


正如@paxdiablo 指出的那样,当我在整个项目中使用它时(我还没睡,请原谅我),strtok(char * str, char * delimiters)需要一个分隔符列表。

我实际上想要做的是root从字符串中删除子home字符串。

因为它们总是以相同的子字符串开头,所以我可以在结束之后/Users/me/Desktop/my-project找到唯一的部分,这可以很容易地做到这一点:homeroot

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

int main()
{
   char root[1000]; 
   char home[1000];

   strcpy(root,"/Users/mbp/Desktop/my-project");
   strcpy(home,"/Users/mbp/Desktop/my-project/home");

   int n = strlen(root); // length of the root string

   // where to copy, from where to start copying, how many to copy
   strncpy(home, home + n ,strlen(home)-1); 

   printf("%s",home);
}

所以我要做的是:

  1. 获取根的长度以知道它在哪里结束
  2. home[n]通过将部分从复制到覆盖存储在家里的东西home[strlen(home)-1]

结果:

/home

推荐阅读