首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C输入电路仿真器

C输入电路仿真器
EN

Stack Overflow用户
提问于 2015-11-29 20:44:41
回答 2查看 1.3K关注 0票数 0

我必须根据我读取的文本文件的输入来创建一个电路。我使用的第一个文本文件具有电路描述,然后是您创建的电路的实际二进制值。

代码语言:javascript
复制
 Example:
 INPUTVAR 3 A B C
 OUTPUTVAR 1 Q
 AND A B w
 AND A C x
 OR w x Q

这个例子的格式意味着有3个输入变量叫做A,B,C。还有一个输出变量Q.the,并创建了一个叫做w= A.B的表达式和x=A.C,或者是q= w.x。我的问题是,我不知道如何阅读这个输入,因为它不是相同的格式,每次。INPUTVAR之后的变量数量取决于第一个数字表示的内容。我对如何在代码中解释这一点感到困惑,我知道如何在格式化的数据中读取。如有任何提示或帮助,将不胜感激。

我相信我需要用fget()来逐行地做。

在帮助下,我想出了以下代码

代码语言:javascript
复制
 FILE *circuit;
 circuit = fopen(argv[1],"r");
 char line[50];
 char *str;
 while (fgets(line,sizeof(line),circuit) != NULL)
 {
 str = strtok(line," "); //space is DELIM
 printf("str is: %s\n",str);
 }

我从作为示例包含的文本文件中获得以下输出: str is: INPUTVAR str is: OUTPUTVAR str is: AND str is:和str is:或

我如何在每一行的第一个单词之后得到字符呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-29 21:45:37

我调整了你的代码,请原谅任何不必要的清理

代码语言:javascript
复制
FILE *circuit;

circuit = fopen(argv[1], "r");
char line[50];
char *str;
char *cp;

while (1) {
    cp = fgets(line, sizeof(line), circuit);
    if (cp == NULL)
        break;

    cp = strchr(line,'\n');
    if (cp != NULL)
        *cp = 0;

    cp = line;
    while (1) {
        str = strtok(cp, " ");
        cp = NULL;

        if (str == NULL)
            break;

        printf("str is: %s\n", str);
    }
}

更新:每个请求的,下面是一个更通用的解决方案,可以让您更接近。这是编译的,但还没有经过测试。但是,它应该给你一个想法。

代码语言:javascript
复制
// circuit -- circuit simulator

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// command parsing control
// NOTE: this can be build up if desired
struct cmd {
    const char *cmd_str;                    // command string
    const char *(*cmd_parse)(struct cmd *); // command parse function
};

// forward declarations
const char *parse_inputvar(struct cmd *cmd);
const char *parse_outputvar(struct cmd *cmd);
const char *parse_and(struct cmd *cmd);
const char *parse_or(struct cmd *cmd);

// list of supported commands
struct cmd cmdlist[] = {
    { .cmd_str = "INPUTVAR", .cmd_parse = parse_inputvar },
    { .cmd_str = "OUTPUTVAR", .cmd_parse = parse_outputvar },
    { .cmd_str = "AND", .cmd_parse = parse_and },
    { .cmd_str = "OR", .cmd_parse = parse_or },
    { .cmd_str = NULL }
};

int
main(int argc,char **argv)
{
    FILE *circuit;
    char line[5000];
    char *cp;
    struct cmd *cmd;
    const char *err;

    --argc;
    ++argv;

    circuit = fopen(*argv, "r");

    while (1) {
        cp = fgets(line, sizeof(line), circuit);
        if (cp == NULL)
            break;

        cp = strchr(line,'\n');
        if (cp != NULL)
            *cp = 0;

        cp = strtok(line," ");

        err = NULL;
        for (cmd = cmdlist;  cmd->cmd_str != NULL;  ++cmd) {
            if (strcmp(cp,cmd->cmd_str) == 0) {
                err = cmd->cmd_parse(cmd);
                break;
            }
        }

        if (cmd->cmd_str == NULL)
            printf("unknown command -- '%s'\n",cp);

        if (err != NULL)
            printf("error in %s command -- %s\n",cmd->cmd_str,err);
    }

    fclose(circuit);
}

const char *
parse_inputvar(struct cmd *cmd)
{
    char *cp;
    char *sym;
    int cnt;
    int idx;
    const char *err = NULL;

    do {
        // get the count string
        cp = strtok(NULL," ");
        if (cp == NULL) {
            err = "missing count";
            break;
        }

        // decode count string into number
        cnt = atoi(cp);
        if (cnt <= 0) {
            err = "bad count";
            break;
        }

        for (idx = 0;  idx < cnt;  ++idx) {
            sym = strtok(NULL," ");

            if (sym == NULL) {
                err = "missing symbol";
                break;
            }

            // NOTE: sym will be invalid after we return so we need to preserve
            // it now
            sym = strdup(sym);

            // do whatever ...
        }
    } while (0);

    return err;
}

const char *
parse_outputvar(struct cmd *cmd)
{
    const char *err = NULL;

    return err;
}

const char *
parse_and(struct cmd *cmd)
{
    const char *err = NULL;

    return err;
}

const char *
parse_or(struct cmd *cmd)
{
    const char *err = NULL;

    return err;
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-29 21:03:13

您可以使用fget()作为字符串读取输入行,并在其上执行拆分()函数将其解析为数字。拆分使用空格作为分隔符创建字符串数组。第一个字符串将是字符串格式的INPUTVAR,然后您可以对它执行一个atoi()来转换为一个数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33987901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档