在c中移动数组元素,是否有更好的选择

时间:2013-05-20 15:03:46

标签: c arrays performance

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

  

(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()strtok()将字符串拆分为(), 我的问题:

我希望各个变量中的前6个整数,例如:

int column = 8
int row = 7 

等......

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

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

我可以遍历我的数组,并将整数复制到它们的变量然后转换为新数组。但那效率很低。

还有其他办法吗?

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

由于

3 个答案:

答案 0 :(得分:3)

仅有良好的输入

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

或类似的东西

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

表示字符,指向预分配数组的索引

对于整数

,给出变量指针/ ref

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

More information

REEDIT 不,这是对的 -

  

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

     

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

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

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

答案 1 :(得分:1)

  

我使用fgets()strtok()将字符串拆分为“()”

  

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

我猜如果strtok()适用于括号,它也适用于逗号。

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

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

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

答案 2 :(得分: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;