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