解析一系列字符

时间:2010-12-02 12:28:10

标签: c arrays parsing char

假设我将“game.abc”作为一个字符串(字符数组),我想获得点之前的字符。您认为在C中最有效的方法是什么?

是一个“直到。复制char到char”的方式去还是有其他方式?

我希望这个问题也可以帮助别人。

谢谢!

4 个答案:

答案 0 :(得分:3)

您还可以使用strchr()后跟strncpy()来查找“。”的第一个实例。在你的字符串中,然后将之前的所有字符复制到另一个字符串

答案 1 :(得分:1)

这取决于您要优化的内容。如果为了便于理解/维护,那么binW的建议是正确的。

如果您正在追逐周期并且只想访问输入的每个字符一次,那么最好按照您的建议并行执行两个操作(搜索点和复制),在同一个循环中执行它们

请注意,后者很有可能过早地优化。

答案 2 :(得分:1)

完全取决于您要实现的目标,在处理速度方面,自己逐字符解析字符串可能是最有效的。否则,标准字符串库函数可能是其他答案中建议的方式。

从缓冲区到缓冲区的最有效复制是:

char *in_ptr = in_string;
char *out_ptr = out_buffer;

while(*in_ptr != '.')
{
    *out_ptr = *in_ptr;
    in_ptr++;
    out_ptr++;
}
*out_ptr = '\0';

然而,这可能会导致缓冲区溢出。

最有效的复制到分配的内存可能是:

char *in_ptr = in_string;

while(*in_ptr != '.') in_ptr++;

out_string = (char *)malloc(in_ptr - in_string + 1);
memcpy(out_string, in_string, (in_ptr - in_string));
out_string[in_ptr - in_string] = '\0';

我希望我的数学是正确的。它应该是。根据编译器的不同,您可以通过将(in_ptr - in_string)赋值给另一个变量来进行轻微优化,这样它只能计算一次。第二个解决方案几乎与调用strchr()然后调用memcpy()相同。我推荐memcpy,因为它节省了必须更换'。'使用null终止符,之后替换它,并将null终止符从一个字符串复制到另一个字符串。

作为放松的答案(在我写这篇文章的时候到了)所有这些都可能是不必要的优化。但很高兴知道。

答案 3 :(得分:0)

您可以使用strtok()来标记字符串。

#include <stdio.h>
main()
{

char str[]="games.abc";
char *tmp,*tmp1;

tmp = strtok(str,".");

printf("tmp %s\n",tmp);

tmp1 = strtok(NULL,"\0");
printf("tmp1 %s\n",tmp1);

}

输出

./tmp1
tmp games
tmp1 abc