标签: strlen

为什么重新实现strlen作为循环+减法?

受到关于SQLite3中以下代码的这个问题的启发:

 static int strlen30(const char *z){
    const char *z2 = z;
    while( *z2 ){ z2++; }
    return 0x3fffffff & (int)(z2 - z);
 }
Run Code Online (Sandbox Code Playgroud)

这附带一条提交消息,说这个函数有助于int溢出.

我对这部分特别感兴趣:

 const char *z2 = z;
 while( *z2 ){ z2++; }
Run Code Online (Sandbox Code Playgroud)

对我来说,这个循环前进,z2直到z2指向null终止符.然后z2-z产生字符串长度.

为什么不使用strlen()这个部分并重写如下:

return 0x3fffffff & (int)(strlen(z));
Run Code Online (Sandbox Code Playgroud)

为什么使用循环+减法代替strlen()?什么可以循环+减法做什么strlen()不可以?

c c++ sqlite string strlen

19
推荐指数
2
解决办法
676
查看次数

哪个C++头文件声明了strlen?

哪个库strlen()属于哪个?

它属于cstring吗?还是string

我尝试了以下代码,它确实有效:

include <iostream>
using namespace std;
//withou include<string.h>

int main() {
    char * str="abc";
    cout<<strlen(str);
}
Run Code Online (Sandbox Code Playgroud)

我设置str等于3并给出正确答案3.

为什么它不包括库字符串或cstring?

我应该在那里包含cstring或string吗?STRING.H?

c++ strlen

17
推荐指数
3
解决办法
5万
查看次数

16
推荐指数
1
解决办法
5万
查看次数

我可以依靠我的编译器来优化const char*上的strlen吗?

在我的SAX xml解析回调(XCode 4,LLVM)中,我正在对这种类型的代码进行大量调用:

static const char* kFoo = "Bar";

void SaxCallBack(char* sax_string,.....)
{
     if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0)
     {

     }


  }
Run Code Online (Sandbox Code Playgroud)

假设strlen(kFoo)由编译器优化是否安全?

(Apple示例代码已经预先计算了strlen(kFoo),但我认为这对于大量常量字符串很容易出错.)

编辑:优化的动机:使用NSXMLParser在iPod touch 2G上解析我的SVG地图需要5秒钟(!).所以,我想切换到lib2xml,并优化字符串比较.

c compiler-construction optimization llvm strlen

15
推荐指数
2
解决办法
5819
查看次数

检查php get variable是否设置为什么?

我需要检查变量是否设置为某些东西.到目前为止,我一直在使用strlen(),但这确实令人尴尬,因为我很确定这不是一个非常有效的功能,可以重复使用.

如何更有效地执行此类检查:

if (strlen($_GET['variable']) > 0)
{
    Do Something
}
Run Code Online (Sandbox Code Playgroud)

请注意,我不希望它做任何事情 $_GET['variable'] = ''

只是为了澄清我的意思 - 如果我有,www.example.com?variable=&somethingelse=1我不希望它渗透那个if语句

php get strlen

15
推荐指数
3
解决办法
3万
查看次数

如何在C中找到argv []的长度

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){
    int fir; //badly named loop variable
    char *input[] = calloc( strlen(argv), sizeof(char)); //initializing an array
    for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
        strcat(input, argv[fir]); // appending to input
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是第7行.它说"从不兼容的指针类型传递'strlen'的参数1".我得到了相同的错误strcat功能.对于这两种功能,它也说"给出了一个char **但是预期的const char *".

我正在尝试使用argv除第一个之外的所有元素填充新数组.我试过了argv = &argv[1],但没用.

这些strlen()strcat()函数不采用char数组吗?

c strlen argv strcat

15
推荐指数
2
解决办法
5万
查看次数

在循环条件中使用strlen()比检查null字符更慢吗?

我已经读过使用strlen比这样的测试更昂贵:

我们有一个x100个字符的字符串.

我觉得

for (int i = 0; i < strlen(x); i++)
Run Code Online (Sandbox Code Playgroud)

比这段代码贵:

for (int i = 0; x[i] != '\0'; i++)
Run Code Online (Sandbox Code Playgroud)

这是真的吗?也许第二个代码在某些情况下不起作用,所以最好使用第一个代码吗?

下面会更好吗?

for (char *tempptr = x; *tempptr != '\0'; tempptr++)
Run Code Online (Sandbox Code Playgroud)

c string-length strlen

14
推荐指数
3
解决办法
1万
查看次数

C++ 11 char16_t strlen-equivalent函数

我有一个简单的问题:是否有办法strlen()在零端接char16_t数组中进行类似字符计数?

strlen c++11 char16-t

12
推荐指数
1
解决办法
3149
查看次数

为什么这个函数返回字符串的正确长度?(增加一个字符指针)

这是一个计算字符串中字符数的函数:

int str_len(const char* s) {
    int i = 0;
    while(*(s++)) {
        i++;
    }
    return i;
}
Run Code Online (Sandbox Code Playgroud)

为什么这会返回正确的长度?

假设我用一个简单的 String 调用这个函数"a"。然后s递增在while循环,因此值si均为0。

c while-loop strlen c89

12
推荐指数
2
解决办法
420
查看次数

混淆二维数组时strlen的意外优化

这是我的代码:

#include <string.h>
#include <stdio.h>

typedef char BUF[8];

typedef struct
{
    BUF b[23];
} S;

S s;

int main()
{
    int n;

    memcpy(&s, "1234567812345678", 17);

    n = strlen((char *)&s.b) / sizeof(BUF);
    printf("%d\n", n);

    n = strlen((char *)&s) / sizeof(BUF);
    printf("%d\n", n);
}
Run Code Online (Sandbox Code Playgroud)

在任何优化级别上使用gcc 8.3.0或8.2.1,但在我期望的时候-O0输出。编译器决定将限制于,因此永远不能等于或超过被除以的值。0 22 2strlenb[0]

这是我的代码中的错误还是编译器中的错误?

标准中并未明确阐明这一点,但是我认为指针来源的主流解释是,对于任何对象X,代码(char *)&X都应生成一个可以迭代整个对象的指针X-即使X碰巧具有子数组作为内部结构。

(奖金问题,是否有gcc标志来关闭此特定优化?)

c arrays strlen multidimensional-array language-lawyer

11
推荐指数
1
解决办法
168
查看次数