1

我总是像瘟疫一样避免使用 strtok,我只在我快速肮脏时使用 *scanf 系列。

flex 并不难,就是这样:

%{
double entries[9];
int position = 0;
int error = 0;
%}

%%
-?[0-9]+(\.[0-9]+)? {if(position == 9) { error = 1; } else { sscanf(yytext,"%lf",entries[position]); position++; } }
\n {}
\r {}
\t {}
. {}
%%

然后我使用 include 创建一个更大的代码文件(我们只能提交一个),我计划提交预处理的源代码(这将包含 line-macros 并且仍然会给出有用/不错的错误 - 如果存在,请归功于 GCC !)但它不会很好看。

看来讲师要我们使用strtok!所以我做了一些阅读并发现:http ://www.cplusplus.com/reference/cstring/strtok/我不会因为避免这种情况而感到难过。

我在这里学到了一个教训,当你有过 C++ 编程的工作,当你有编程经验时,不要认为“入门模块”会很容易。

我问的原因是因为我不确定输入文件的格式,它似乎显示了 3 行数字,数字用空格分隔,这一切都很好,但它是 \n 还是另一个(或 \r\n 我认为适用于 Windows?)

啊好啊,已经有人问过了!从文件中读取 3x3 矩阵,然后在 C 中显示它,所以我有一个如何做到这一点的答案。尽管如此,请帮我解决一下strtok?我觉得我应该能够在这样的模块中跳过箍。

4

2 回答 2

2

我不清楚,你想填充一个 3x3 矩阵避免使用strtok

构建您自己的功能,易于使用strtod

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

int main(void)
{
    char *s = "1.1 2.1 3.1\r\n1.2 2.2 3.2\n1.3 2.3 3.3", *p = s;
    double data[3][3];
    int i = 0, n = 9;

    for (i = 0; i < n; i++) {
        data[0][i] = strtod(p, &p);
    }
    return 0;
}

两者都适用\n\r\n因为strtod会丢弃空格和isspace字符。

于 2013-11-07T12:55:52.597 回答
1

你可能想看看 strtok 函数的实现。

苹果版

微软版

如 cplusplus.com 所述,要点是:

找到最后一个标记的点由函数内部保存,以便在下次调用时使用(不需要特定的库实现来避免数据竞争)。

见微软版本的声明 static char *lastToken = NULL; /* UNSAFE SHARED STATE! */

于 2013-11-07T12:21:15.707 回答