strtok() C 字符串到数组

strtok() C-Strings to Array

提问人:morelaak 提问时间:9/14/2018 更新时间:9/14/2018 访问量:2474

问:

目前正在学习 C,在将 C 字符串标记传递到数组中时遇到了一些麻烦。行通过标准输入输入,strtok 用于拆分行,我想将每个行正确地放入一个数组中。退出输入流需要 EOF 检查。这是我所拥有的,设置好以便它将令牌打印回给我(这些令牌将在不同的代码段中转换为 ASCII,只是尝试先让这部分工作)。

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

int main()
{
  char string[1024]; //Initialize a char array of 1024 (input limit)

  char *token;
  char *token_arr[1024]; //array to store tokens.
  char *out; //used
  int count = 0;

  while(fgets(string, 1023, stdin) != NULL) //Read lines from standard input until EOF is detected.
  {
    if (count == 0)
      token = strtok(string, " \n"); //If first loop, Get the first token of current input

    while (token != NULL) //read tokens into the array and increment the counter until all tokens are stored
    {
      token_arr[count] = token;
      count++;
      token = strtok(NULL, " \n");
    }
  }

  for (int i = 0; i < count; i++)
    printf("%s\n", token_arr[i]);
  return 0;
}

这对我来说似乎是正确的逻辑,但我仍在学习。问题似乎出在使用 ctrl-D 发送 EOF 信号之前在多行中流式传输。

例如,给定以下输入:

this line will be fine

程序返回:

this line will be fine

但如果给出:

none of this

is going to work

它返回:

is going to work

ing to work

to work

非常感谢任何帮助。在此期间,我会继续努力。

C 数组 fgets eof strtok

评论

0赞 Roflcopter4 9/14/2018
呃。不要使用 strtok。使用 strsep。如果您没有 strsep,请编写自己的 strsep。Strtok 是有史以来最糟糕的函数。(直接引用Brian Kernighan的话)

答:

3赞 John3136 9/14/2018 #1

这里有几个问题:

  1. 一旦字符串被“重置”为新值,你就再也不会调用,所以仍然认为它正在标记你的原始字符串。token = strtok(string, " \n");strtok()

  2. strtok正在返回指向 里面的“子字符串”的指针。您正在更改其中的内容,因此您的第二行有效地破坏了您的第一行(因为原始内容已被覆盖)。stringstringstring

要做你想做的事,你需要将每一行读入不同的缓冲区或复制返回的字符串(是一种方式 - 只要记住每个副本......strtokstrdup()free()

评论

0赞 morelaak 9/14/2018
谢谢!你为我指明了正确的方向。我最终将输入传递到缓冲区,并在开始标记化之前使用 strcat 构建完整的字符串。现在就像一个魅力!