用C将整数和字符的文件内容存储在C中

时间:2018-08-22 07:45:01

标签: c arrays string stdin rpn

我有一个文本文件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,依此类推。

2 个答案:

答案 0 :(得分:1)

到目前为止,您的示例工作良好!感谢您发布一个问题,解释您想要的内容,并尝试解决该问题。

您遇到的主要问题是,当需要array of array of chars时,您正在存储array of array of strings(记住stringchar *)。 / 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解析令牌:

    • 如果令牌是数字,则将其值压入堆栈
    • 如果令牌是运算符,请在堆栈的前2个元素之间执行此操作,然后将结果弹出后将结果存储到堆栈中。
  • 在该行的末尾,在堆栈顶部打印该值

您要对堆栈的上溢和下溢执行简单的检查。

这是一个示例实现:

#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