我使用以下代码在字符串中首次出现时搜索字符。 但这个角色太长或者我的角色需要一些时间 搜索在很大程度上延迟了其他操作。我怎么能解决这个问题。代码在这里。
注意:attrPtr
是char *
,它包含对远程包含'"'
字符的字符串的引用。
int position = 0;
char qolon = '"';//character to search
while (*(attrPtr + position++) != qolon);
char* attrValue = NULL;
attrValue = (char*)malloc(position * sizeof(char));
strncpy(attrValue, attrPtr, position-1);
答案 0 :(得分:24)
strchr
通常会更快一些。此外,您需要检查NUL终结器,strchr将为您处理。
char *quotPtr = strchr(attrPtr, qolon);
if(quotPtr == NULL)
{
... // Handle error
}
int position = quotPtr - attrPtr;
char* attrValue = (char*) malloc((position + 1) * sizeof(char));
memcpy(attrValue, attrPtr, position);
attrValue[position] = '\0';
我还没有测试过。
编辑:逐个修复。
答案 1 :(得分:7)
C有一个内置函数,用于搜索字符串中的字符 - strchr()
。 strchr()
返回指向找到的字符的指针,而不是数组位置,所以你必须从返回的指针中减去指向字符串开头的指针才能得到它。您可以将您的功能重写为:
char qolon = '"';//character to search
char *found;
char *attrVal = NULL;
found = strchr(attrPtr, qolon);
if (found)
{
size_t len = found - attrPtr;
attrVal = malloc(len + 1);
memcpy(attrVal, attrPtr, len);
attrVal[len] = '\0';
}
这可能比一个小的常数因子更快;但是,你不会得到一个数量级的加速。在无序字符串中搜索字符基本上是字符串长度中的O(n)。
答案 2 :(得分:4)
两件重要的事情:
1)在以这种方式搜索字符串时,始终检查NULL终止符:
while (*(attrPtr + position++) != qolon);
应该是:
while (attrPtr[position] && attrPtr[position++] != qolon);
(如果传递了缺少搜索字符的字符串,则扫描所有内存可能需要很长时间)。编辑:我刚才注意到其他人发布了这个,我,但是哦。我不同意,顺便说一句,strchr()很好,但是一个简单的循环也可以检查终结符也很好(并且通常也有优势)。
2)注意strncpy()!
strncpy(attrValue, attrPtr, position-1);
strlen(attrPtr)> =(position-1)所以这将 NOT null终止attrValue中的字符串,这可能会导致各种问题(包括以后令人难以置信的代码减速)。作为一个相关的注释,strncpy()是erm,设计独特,所以如果你做了类似的事情:
char buf[512];
strncpy(buf,"",4096);
您将写入4096个字节的零。
就个人而言,我在Win32上使用lstrcpyn(),而在其他平台上,我有一个简单的实现。这对我来说更有用。
答案 3 :(得分:2)
它需要O(n)
算法来搜索字符串中的字符。所以你不能比你已经做的更好。另请注意,您缺少memset(attrValue, 0, position);
,否则您的字符串attrValue
将不会以空值终止。
答案 4 :(得分:2)
您发布的算法无法正确处理字符串中不存在该字符的情况。如果发生这种情况,它将只是通过内存进行漫步,直到它随机发生找到与您的char匹配的字节,或者您超过分配的内存并获得段错误。我怀疑这就是为什么它有时候“花费太长时间”。
在C中,字符串通常以0结尾(ascii nul或'\0'
)。或者,如果您提前知道字符串的长度,则可以使用它。
当然,有一个标准的C库例程正是这样做的:strchr()
。一个聪明的程序员会使用它而不是通过滚动自己来冒险。