我正在尝试编写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
答案 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
溢出,我会将array
与i
的值进行比较。会没事吗?
MAX_str