【问题标题】:C strtok() not tokenizing correctly?C strtok() 没有正确标记?
【发布时间】:2019-11-10 03:42:38
【问题描述】:

我一直在尝试解决这个问题,但我完全不知道如何解决这个问题。我有一个相当大的项目,我无数次使用 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 吗?

【问题讨论】:

  • 我认为您需要进一步阅读strtok,第二个参数是指向 single 字符列表的指针以用作分隔符,它不太适合用于删除常用前缀。
  • @paxdiablo 哦,你说得对,我在整个项目中一直在使用你所说的话,哈哈。你回答后我找到了解决方案。谢谢你:)
  • 杰弗里,您应该发布您的解决方案作为答案并自我接受。按照 SO 指南,这完全没问题。

标签: c arrays string token strtok


【解决方案1】:

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

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

由于它们总是以相同的子字符串 /Users/me/Desktop/my-project 开头,所以我可以在 root 结束后立即找到 home 独有的部分,并且可以很容易地做到这一点:

#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

【讨论】:

  • 为什么不简单地puts (strrchr (home, '/'));
  • @DavidRankin-ReinstateMonica 如果假设用户在主/桌面目录中,那将无法正常工作。我必须给他看家/桌面,而不仅仅是/桌面
  • 如果".../home/..." 的出现次数不能超过一次,那么只需puts (strstr (home, "/home"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多