线性搜索vs strlen

时间:2014-02-25 01:06:05

标签: c pointers

在我的一项任务中,我被要求使用线性搜索来查找字符串的最后一个字符并将其设置为指针,它只是一个简单的字符串,例如"blah blah blah"。为此,我使用了

int length = strlen(string);

找到长度,然后使用for循环

for (i=1;i<length;i++){
    if (string[i]==0){;
        end_pointer = &string[i-1];
    }

使用线性搜索0来设置指针与使用长度相比有什么区别:

end_pointer = &string[length-1];

4 个答案:

答案 0 :(得分:3)

我认为你的教授真正想要的是:

int i = 0;
while( '\0' != string[i] ) i++;

用于搜索

循环完成后分配以获得最佳效率:

char * end_pointer = &string[i - 1];

答案 1 :(得分:0)

我想我需要解释字符串是如何存储在C中的。

由于字符串通常具有任意长度,因此需要一种方法来表示该长度以及字符串的内容。表示长度的两种最简单的方法如下:

  • 明确跟踪长度
  • 使用特殊标记表示字符串
  • 的结尾

C语言采用了第二种选择。具体来说,'\0'用于表示字符串的结尾。所以,如果你有一个char * p,那么这是一个指向第一个字符的指针;字符串中的第二个字符是p[1] == *(p+1),依此类推。

那你怎么得到字符串的长度?在表示字符串的第一种方法(不是C方式)中,它已经明确可用。对于C字符串,您必须从头开始计算有多少个字符,直到特殊标记(C中的'\0')。这称为字符串标记结束的线性搜索。

strlen实现了这种线性搜索,但听起来你不应该使用它。无论如何,strlen实际上并没有给你指向字符串末尾的指针;你必须把它计算为

char *endPtr = string + strlen(string);

在这种情况下,endPtr实际上将指向空终止字符,该字符刚好超过字符串的结尾。这是C中用于指定范围的常见范例:范围的起点(在本例中为string)通常为包含,范围的结尾(endPtr in这种情况)通常是独家


char *可能只是指向单个char的指针而不一定是字符串,但这并不涉及我们。

答案 2 :(得分:0)

使用'\0'的线性搜索来设置指针而不是使用从strlen()派生的长度之间的差异是一个轻微的潜在效率变化。

如果滚动自己的代码或使用标准库函数strlen(),它仍然是复杂度O(n)的相同顺序。如果有的话,srtrlen()有可能提高效率。


如果目标是创建自己的代码并指向字符串中的最后一个char(而不是'\0'),请将""作为一种特殊情况处理,否则执行一个简单的操作回路;

char *LastCharPointer(char *string) {
  if (*string == '\0') {
    return NULL;
  }
  do {
    string++;
  } while (*string);
  return string - 1;
}

如果目标是指向空字符'\0'

char *NullCharPointer(char *string) {
  while (*string) string++;
  return string;
}

答案 3 :(得分:-1)

我假设您粘贴的代码不是您编写的实际代码,它将是:

for( i = 0; i < strlen( string ); i++ ) {
   if( string[ i ] ){
      end_pointer = &string[i - 1];
   }
}

您可以通过两种方式执行此操作:

char * end_pointer = &string[ strlen( string ) - 1 ]

for( i = 0; string[ i ] ; i++ );
char * end_pointer = &string[ i - 1 ]

当您调用strlen()时,它会以线性时间运行以计算长度。一旦你有了长度,你可以直接索引到字符串,或者你自己可以搜索终止'\ 0'字符。假设您的字符串以空值终止,所有这些都有效。 编辑:第二个选项缺少“;”。