[英]finding character in string C language
我正在使用以下代码在字符串中首次出现一个字符。 但是当角色太长或者我正在搜索的角色在很远的程度上需要一些时间,这会延迟其他操作。 我怎么能解决这个问题。 代码如下。
注意: attrPtr
是一个char *
,它包含对远端包含'"'
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);
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';
不过,我还没有测试过。
编辑:修复一个一个。
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)。
两件重要的事情:
1)在以这种方式搜索字符串时,始终检查NULL终止符:
while (*(attrPtr + position++) != qolon);
应该:
while (attrPtr[position] && attrPtr[position++] != qolon);
(如果传递了一个缺少搜索字符的字符串,则扫描所有内存可能需要很长时间)。 编辑:我刚才注意到其他人发布了这个,我,但是哦。 我不同意,顺便说一句,strchr()很好,但是一个简单的循环也可以检查终结符(也常常有优点)。
2)注意strncpy()!
strncpy(attrValue, attrPtr, position-1);
strlen(attrPtr)> =(position-1)所以这将不会在attrValue中终止字符串,这可能会导致各种问题(包括以后令人难以置信的代码减速)。 作为一个相关的注释,strncpy()是erm,设计独特,所以如果你这样做:
char buf[512];
strncpy(buf,"",4096);
您将写入4096个字节的零。
就个人而言,我在Win32上使用lstrcpyn(),而在其他平台上我有一个简单的实现。 这对我来说更有用。
它需要O(n)
算法来搜索字符串中的字符。 所以你不能比你已经做的更好。 另请注意,您缺少memset(attrValue, 0, position);
,否则你的字符串attrValue
将不会以null结尾。
您发布的算法无法正确处理字符串中不存在该字符的情况。 如果发生这种情况,它将只是通过内存进行漫步,直到它随机发生找到与您的char匹配的字节,或者您超过分配的内存并获得段错误。 我怀疑这就是为什么它有时似乎“花了太长时间”。
在C中,字符串通常以0结尾(ascii nul或'\\0'
)。 或者,如果您提前知道字符串的长度,则可以使用它。
当然,有一个标准的C库例程就是这样做的: strchr()
。 一个聪明的程序员会使用它而不是通过滚动自己来冒险。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.