【问题标题】:A Little strtok() Fun一点 strtok() 乐趣
【发布时间】:2012-10-01 01:23:28
【问题描述】:

我不是最好的指针,所以也许你可以看到我做错了什么。

假设我有一个这样初始化的数组:

char *arrayOfCommands[]={"ls -l", "wc -l"};

我的目标是从这个数组中得到一个名为 char *currentCommand 的数组,该数组查看 arrayOfCommands 的特定单元格并将命令分隔成空格。

我的最终目标是在每个循环上都有一个新的 currentCommand 数组,每个看起来像这样:

First Loop:  
currentCommand = [ls][-l]

First Loop:  
currentCommand = [wc][-l]

这是我目前的代码:

for (i = 0; i < 2; ++i) {
    char str[] = arrayOfCommands[i];
    char * currentCommand;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    currentCommand = strtok (str, " ");
    while (currentCommand != NULL){
        printf ("%s\n",currentCommand);
        currentCommand = strtok (NULL, " ");
    }

    .
    .
    .

    //Use the currentCommand array (and be done with it)
    //Return to top
}

任何帮助将不胜感激! :)

更新:

for (i = 0; i < commands; ++i) {
    char str[2];
    strncpy(str, arrayOfCommands[i], 2);
    char *currentCommand[10];
    printf ("Splitting string \"%s\" into tokens:\n",str);
    currentCommand = strtok (str, DELIM);
    while (currentCommand != NULL){
        printf ("%s\n",currentCommand);
        currentCommand = strtok (NULL, DELIM);
    }
}

我收到此错误:** 分配中的类型不兼容**
它正在谈论我正在传递 strtok 函数的“str”。

【问题讨论】:

  • 您确定strtok() 是最佳选择吗?您是否考虑过使用strcspn()strpbrk() 或类似的东西? strtok() 是一个危险的函数。如果你在库函数中使用它,你必须记录你这样做,因为使用它,你会对任何在使用strtok() 时调用你的函数的人造成严重破坏。并且您还必须注意不要出于同样的原因调用使用strtok() 的任何其他函数。一般来说,请避开strtok(),除非有老师在火焰中牵着你的手并强迫你把它们留在那儿寻找strtok_r()
  • char str[] = arrayOfCommands[i]; 是什么意思?
  • 您似乎将字符串、char 数组和指针数组混为一谈。也许作为第一步,您可以编写一些带有单个命令字符串并将其解析为令牌数组的东西。创建一个函数,现在您可以为arrayOfCommands[] 中的每个项目调用一些内容。再三考虑,第一步只需将每个标记打印在单独的行上,然后再尝试构建标记数组。

标签: c strtok


【解决方案1】:

strtok 通过修改你传递的字符串来操作;使用一些手册页时很容易忽略这一点。数组中的每个命令都是一个文字字符串:尝试修改它们会导致问题。因此,在将每个命令与strtok 一起使用之前,您需要为每个命令制作一个副本

此外,这是对数组的无效初始化:

char str[] = arrayOfCommands[i];

str 声明为某个固定大小的数组,然后使用strncpy 制作每个命令的副本,然后再使用strtok 对它们进行标记:

char str[MAX_COMMAND_LEN + 1];
strncpy(str, arrayOfCommands[i], MAX_COMMAND_LEN);

// ...

【讨论】:

  • 容易错过?始终阅读错误部分。 kernel.org/doc/man-pages/online/pages/man3/strtok.3.html#bugs
  • @VladLazarenko 这只是一个例子。并非每个手册页都有该部分。
  • strncpy 旨在与 UNIX 目录条目一起使用,这些条目是 14 字节数组,必须用 nul 填充,但不能用 nul 终止。对于其他任何事情,它都不是正确的解决方案,因为它 1) NUL-pads,这不是必需的,并且 2) NUL 终止失败,这会导致 UB。
  • @pb2q 我已经更新了我的代码,但我仍然收到一个小错误。有办法解决吗? (对不起,我不是最擅长的!)
  • @Rick_Sch 是因为你声明 currentCommand: strtok 传回 char *,但 currentCommand _isn't_ a char *. Also, your str` 太小:只有 2 个字符对于每个命令,最后您对 strncpy 的使用可能无法以空值终止 str
猜你喜欢
  • 2017-02-08
  • 2016-11-05
  • 2010-12-24
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多