在字符串C语言中查找字符

时间:2010-06-03 04:52:34

标签: c

我使用以下代码在字符串中首次出现时搜索字符。 但这个角色太长或者我的角色需要一些时间 搜索在很大程度上延迟了其他操作。我怎么能解决这个问题。代码在这里。

注意:attrPtrchar *,它包含对远程包含'"'字符的字符串的引用。

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);

5 个答案:

答案 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()。一个聪明的程序员会使用它而不是通过滚动自己来冒险。