4

我正在从文件中读取输入(逐行)每一行都是游戏板的状态。下面是输入示例:

(8,7,1,0,0,0,b,b,b,b,b,b,b,b,b,b,b,b,s,s,r,r,g,b,r ,g,r,r,r,r,b,r,r,s,b,b,b,b,r,s,s,r,b,b,r,s,s,s,r,b ,g,b,r,r,r,r,r,r,r,r,r,s) 0

我已经使用fgets()andstrtok()将字符串拆分为(),我的问题:

我想要它们各个变量中的前 6 个整数,例如:

int column = 8
int row = 7 

很快..

我想去掉 input- 0 末尾的最后一个整数,并且字符应该存储在一个数组中,因为它们代表一块板。

现在,我有一个将所有整数和字符存储在一起的数组。

我可以遍历我的数组,并将整数复制到它们的变量中,然后将字符复制到新数组中。但这是低效的。

还有另一种方法吗?

我使用fscanf()但不知道如何使用分隔符拆分字符串。

谢谢

4

3 回答 3

3

仅格式良好的输入

if (fscanf(FILE_PTR, "(%d,%d,...,%c,%c,%c,...,%c) %*d", &column, &row, ..., &chars[0], &chars[1], ...) == 60)

或类似的东西

说明%*d符将丢弃该输入(您不想要最后一个数字)

对于字符,为预分配数组提供指向它们的索引的指针

对于整数,给变量指针/引用

感谢 Jon Leffler 提醒您应该测试*scanf(读取的内容数)的输出!

更多信息

重新编辑不,这是正确的 -

int fscanf ( FILE * stream, const char * format, ... );

format: 包含一系列字符的 C 字符串,这些字符控制如何处理从流中提取的字符:

  • 空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。
  • 非空白字符,格式说明符 (%) 除外:任何不是空白字符(空格、换行符或制表符)或格式说明符的一部分(以 % 字符开头)的字符都会导致函数读取下一个字符从流中,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数失败,返回流的后续字符并将其保留为未读。
  • 格式说明符:由初始百分比符号 (%) 形成的序列表示格式说明符,用于指定要从流中检索并存储到附加参数指向的位置的数据的类型和格式。

以上引用来自这里。我知道这里对 cplusplus.com 的敌意,但我无法访问该标准。如果您愿意,请随时编辑

于 2013-05-20T15:16:45.447 回答
1

我已经使用fgets()strtok()在“()”处拆分字符串

之后

我使用fscanf()但不知道如何使用分隔符拆分字符串。

我想如果strtok()为括号工作,它也适用于逗号。

除此之外:你有几种可能做你想做的事。如果没有提供太多上下文,我真的不能告诉你你想要哪一个,但我们开始吧:

  1. 获取指向第一个非整数的指针,并将其用作指向另一个数组的第一个元素的指针,仅包含整数。这避免了所有复制和/或移动开销。

  2. 用于memcpy()仅将数组的必要部分复制到另一个数组。memcpy()通常是高度优化的并且比天真的 for-loop-with-assignment 方法更快。

于 2013-05-20T15:07:47.857 回答
0

如果你有一个char *,你可以把它想象成一个数组或一个字符串,因为内存布局是一样的......

char * input = "(8,7,1,0,0,0,b,b,b,b,b,b,b,b,b,b,b,b,s,s,r,r,g,b,r,g,r,r,r,r,b,r,r,s,b,b,b,b,r,s,s,r,b,b,r,s,s,s,r,b,g,b,r,r,r,r,r,r,r,r,r,s) 0";
size_t len = strlen(input);
int currentIndex = 0;
char * output = calloc(1,len);
for (int i = 0 ; i<len ; i++)
{
    if (input[i] == '(' || input[i] == ')' || input[i] == ','|| input[i] == ' ') {
        continue;
    }
    output[currentIndex++] = input[i];
}
assert(strlen(output) == 63); //well formatted?
char a = output[0];
char b = output[1];
char (* board)[60] = malloc(60); //pointer to array or is it a mal-formed string.
memcpy(board, output+2, 60);
char last = output[62];

我要添加的主要内容是,如果您想将其用作字符串,则必须使数组 1 更大并设置board[60] = \0;

于 2013-05-20T21:42:50.990 回答