我有一个文本文件input.txt
,其内容格式为:
12 3 /
2 3 -
3 4 *
1 2 4 + - 5 * 7 /
我的最终目标是读取文件的每一行并评估给定的RPN表达式。我编写了以下代码片段,以从stdin读取文件的内容并将其存储在字符数组中:
char expression[1000][256];
int i = 0;
while (fgets(expression[i], 256, stdin))
{
expression[i][strcspn(expression[i],"\r\n")] = 0;
i++;
}
现在,我将数组中的所有行都包含在内。我在这里的问题是,我要存储这些字符,以使它们没有空格,并且每个数字(所有数字)或字符都在单独的索引中。
例如,这里expression[0][0]
是1,而expression[0][1]
是2。但是,我希望expression[0][0]
是12,而expression[0][1]
是3,依此类推。
答案 0 :(得分:1)
到目前为止,您的示例工作良好!感谢您发布一个问题,解释您想要的内容,并尝试解决该问题。
您遇到的主要问题是,当需要array of array of chars
时,您正在存储array of array of strings
(记住string
是char *
)。 / p>
我使用了[strtok][1]
方法,该方法在每次击中调用中列出的字符之一时都会拆分一个字符串(使用NULL字符)。然后分配内存,并将字符串复制到数组中。
我编写了一些示例代码(try it online)来完成此操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char* expression[1000][256];
char buffer[256];
int line = 0;
while (fgets(buffer, 256, stdin)) {
int word = 0;
char* token = strtok(buffer, " \r\n");
do {
expression[line][word] = calloc(sizeof(char), strlen(token) + 1);
strcpy(expression[line][word], token);
word++;
} while ((token = strtok(NULL, " \r\n")) != NULL);
line++;;
}
printf("'%s', '%s', '%s'\n", expression[0][0], expression[0][1], expression[0][2]);
return 0;
}
答案 1 :(得分:0)
您可能不需要将整个文件存储在内存中,而是一次读取一行,对其进行评估并打印结果:
int
的数组以用作RPN堆栈在嵌套循环中,使用strtok
解析令牌:
在该行的末尾,在堆栈顶部打印该值
您要对堆栈的上溢和下溢执行简单的检查。
这是一个示例实现:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char buffer[256];
int stack[sizeof(buffer) / 2]; // no need for stack overflow check
int i, sp, tos;
while (fgets(buffer, sizeof buffer, stdin)) {
char *p = buffer, *token, *q;
sp = -1;
stack[++sp] = 1;
stack[++sp] = 1;
while ((token = strtok(p, " \t\r\n")) != NULL) {
p = NULL;
tos = stack[sp];
if (!strcmp(token, "+")) {
stack[--sp] += tos;
} else
if (!strcmp(token, "-")) {
stack[--sp] -= tos;
} else
if (!strcmp(token, "*")) {
stack[--sp] *= tos;
} else
if (!strcmp(token, "/")) {
if (tos == 0 || (tos == -1 && stack[sp - 1] == INT_MAX)) {
printf("division overflow\n");
break;
}
stack[--sp] /= tos;
} else
if (!strcmp(token, "%")) {
if (tos == 0 || (tos == -1 && stack[sp - 1] == INT_MAX)) {
printf("division overflow\n");
break;
}
stack[--sp] %= tos;
} else {
tos = strtol(token, &q, 0);
if (q == token || *q != '\0') {
printf("invalid token: %s\n", token);
break;
}
stack[++sp] = tos;
}
if (sp < 2) {
printf("stack underflow for %s\n", token);
break;
}
}
if (token == NULL) {
for (i = 2; i <= sp; i++) {
printf("%d%c", stack[i], i == sp ? '\n' : ' ');
}
}
}
return 0;
}
输入:
12 3 /
2 3 -
3 4 *
1 2 4 + - 5 * 7 /
输出:
4
-1
12
-3