如何从stdin获取行并将其拆分为令牌?

时间:2018-01-08 16:03:23

标签: c string

我正在尝试编写RPN计算器,但我一直在努力从用户那里获取参数。我想要做的是:取整行,将其拆分为令牌并将其放入阵列。我有类似下面的东西,但它只工作一次。在第二个while循环中执行,但是arr==NULL

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

#define MAX_str 100

char* getLine(){
  char* line = malloc(MAX_str*sizeof(char*));
  return fgets(line, MAX_str,stdin);
}

char** toArray(char* line){
  int i=0;
  char** array= malloc(MAX_str*sizeof(char*));
  array[i] = strtok(line," \t");
  while(array[i]!=NULL){
    array[++i] = strtok(NULL,"");
  }
  return array;
}

int main(){
  char* linia;
  char** arr;
  int i=0,end=0;

  while(!end){
    linia=getLine();
    arr = toArray(linia);
    while(arr[i]!=NULL){
      printf("%s\n",arr[i]);
      i++;
    }
  free(linia);
  free(arr);
  }
}

其次,strtok仅在两个令牌上分割,例如

>1 2 3

给出:

>1
>2 3

2 个答案:

答案 0 :(得分:0)

代码的主要问题是使用空令牌字符串进行strtok()的后续调用。根据需要添加字符到第二个令牌列表

// array[++i] = strtok(NULL,"");
array[++i] = strtok(NULL," \t\n");

getLine()的改进思路:读取然后分配。

char* getLine(){
  char buf[MAX_str];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return NULL;
  }
  return strdup(buf);
}

strdup()很常见,但不在C标准中。 Code example

答案 1 :(得分:0)

好吧,愚蠢的花费时间......我忘记在i中的while循环后重置main() ...

这段代码更好吗?我希望arr成为char的{​​{1}}指针表。声明好吗?使用MAX_str会像上面的答案一样进行初始化吗?为防止malloc溢出,我会将arrayi的值进行比较。会没事吗?

MAX_str