使用 strtok 并尝试将它们的值存储到数组中

Using strtok and trying to store their values into an array

我是 C 的新手,我一直在尝试一些东西,但它似乎并没有真正起作用: 我有一个数组 char *initialParts;,我根据用户的输入分配 space,但我认为这并不重要。 我还有一个计数器 initialPartsCounter = 0; 用作索引,以便在分配的内存的每个索引处存储一个字母。 到目前为止,我得到了这个:

            char *initialParts;
            const char comma[3] = ",";
            int initialPartsCounter = 0;
            initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
            char *token;
            token = strtok(fileLine, comma);

            while (token != NULL) {
                strcpy(&initialParts[initialPartsCounter], token);
                initialPartsCounter++;
                token = strtok(NULL, comma);
            }

            for (int l = 0 ; l < (int)numInitialParts; l++)
            {
                printf("%c", initialParts[l]);
            }

其中numInitialParts是用户输入的数字,fileLine是读入文件的一行。 在下面的示例中,numInitialParts = 4and fileLine = 'q,d,c,k' 在我的 for 循环中,打印的输出很奇怪:qdck☐☐☐☐(我无法复制 k 之后的字符,因为当我粘贴它时它什么也没做,但它有些相似,请检查图片以查看它的外观).

编辑:我的理想输出是:

qdck

如果有人有解决此问题的想法,我将很高兴听到。谢谢!

initialParts = (char*)malloc((int)numInitialParts * sizeof(char));

你应该使用双指针或二维数组来存储token(因为它是字符序列(字符串)而不是字符)。如果你不知道之前有多少份,你可以用realloc每次增加numInitialParts

例如:

char **initialParts = malloc(sizeof(char*));

// check initialParts here

token = strtok(fileLine, comma);

while (token != NULL) {
    initialParts[initialPartsCounter] = malloc(sizeof(char) * 2);
    // check initialParts[initialPartsCounter] here
    strcpy(initialParts[initialPartsCounter], token);
    initialPartsCounter++;
    initialParts = realloc((initialPartsCounter+1)*sizeof(char));
    // check initialParts here
    token = strtok(NULL, comma);
 }

因为你打印

printf("%c", initialParts[l]);

我可以猜到initialParts被定义为一个char *然后动态分配。

strtok一般用于获取各种长度的token。即使您可能确定原始逗号分隔字符串仅由一个字符组成,但当您执行

strcpy(&initialParts[initialPartsCounter], token);

您正在将至少两个字符复制到字符数组:令牌字符(例如'q')和字符串终止符'[=17=]' (字符串只是一个以零结尾的字符数组,所有字符串操作函数都依赖于它)。

随心所欲

initialParts[initialPartsCounter] = *token;

确实这不是主要错误。事实上,尽管它显示出对 strtok 如何工作的一些误解,但它会一直工作,直到 initialParts 数组中有足够的空间来存储当前字符和字符串终止符。

另一个错误是,虽然您从 strtok 解析中只得到 initialPartsCounter 个字符,但您打印了数组 (numInitialParts) 的所有字符。最后的那些将毫无意义,因此更正它代码将按预期工作。

以下示例将您的代码嵌入到一个简单的主函数中(我手动定义了输入`char fileLine[] = "q,d,c,k"):

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

int main(void)
{
  char *initialParts, *token;
  char fileLine[] = "q,d,c,k";
  const char comma[3] = ",";
  int initialPartsCounter = 0, numInitialParts = 20;
  initialParts = (char*)malloc((int)numInitialParts * sizeof(char));

  token = strtok(fileLine, comma);

  while (token != NULL)
  {
    //strcpy(&initialParts[initialPartsCounter], token);
    initialParts[initialPartsCounter] = *token; //Use this only if tokens are only one char long
    initialPartsCounter++;
    token = strtok(NULL, comma);
  }

  for (int l = 0 ; l < initialPartsCounter; l++)
  {
    printf("%c", initialParts[l]);
  }
  printf("*end\n");

  free(initialParts);

  return 0;
}

我还打印了一个 结束字符串 以显示没有任何尾随意外字符。输出是

qdck*end