受到关于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()不可以?
哪个库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?
在我的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,并优化字符串比较.
我需要检查变量是否设置为某些东西.到目前为止,我一直在使用strlen(),但这确实令人尴尬,因为我很确定这不是一个非常有效的功能,可以重复使用.
如何更有效地执行此类检查:
if (strlen($_GET['variable']) > 0)
{
Do Something
}
Run Code Online (Sandbox Code Playgroud)
请注意,我不希望它做任何事情 $_GET['variable'] = ''
只是为了澄清我的意思 - 如果我有,www.example.com?variable=&somethingelse=1我不希望它渗透那个if语句
#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数组吗?
我已经读过使用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) 我有一个简单的问题:是否有办法strlen()在零端接char16_t数组中进行类似字符计数?
这是一个计算字符串中字符数的函数:
int str_len(const char* s) {
int i = 0;
while(*(s++)) {
i++;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
为什么这会返回正确的长度?
假设我用一个简单的 String 调用这个函数"a"。然后s递增在while循环,因此值s和i均为0。
这是我的代码:
#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标志来关闭此特定优化?)