strtok()C字符串到数组

时间:2018-09-14 00:34:46

标签: c arrays fgets eof strtok

当前正在学习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

非常感谢您的帮助。同时,我会继续努力。

1 个答案:

答案 0 :(得分:3)

这里有几个问题:

  1. 一旦将字符串“重置”为新值,就永远不会再调用token = strtok(string, " \n");,因此strtok()仍然认为它是在标记原始字符串。

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

要执行所需的操作,您需要将每一行读入不同的缓冲区中,或复制strtok返回的字符串(strdup()是一种方法-只需记住free()每个副本...)