我正在尝试编写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

最佳答案

代码的主要问题是对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

关于c - 如何从stdin获取行并将其拆分为 token ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48153911/

10-12 16:14