我想将一个以null结尾的字符串复制到另一个位置,并想知道复制的字符串有多长.效率至关重要.有一个strcpy功能可以实现这一点,但它不会返回实际复制的字符数.
当然,我可以通过简单地调用strlen后来检测复制字符串的长度来找到它,但这意味着第二次再次遍历字符串中的字符,尽管strcpy必须跟踪它复制的字符数.出于性能原因,我不想进行这样的第二次遍历.
我知道strcpy使用简单的char-by-char副本编写自己很容易,但我认为标准库可能会应用魔法,这strcpy比使用简单的char-by-char实现更快.
那么,在strcpy没有再次遍历字符串的情况下,获取复制字符数的最佳方法是什么?
正如标题所说:PHP中的$ str ==''和strlen($ str)== 0之间有区别吗?有没有真正的速度差异,并且比另一个更好用?
我从php.net站点有以下函数来确定ASCII和UTF-8字符串中的字节数:
<?php
/**
* Count the number of bytes of a given string.
* Input string is expected to be ASCII or UTF-8 encoded.
* Warning: the function doesn't return the number of chars
* in the string, but the number of bytes.
*
* @param string $str The string to compute number of bytes
*
* @return The length in bytes of the given string.
*/
function strBytes($str)
{
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 …Run Code Online (Sandbox Code Playgroud) 我已经开始打扰你了另一个可能非常简单的C问题.
使用以下代码:
int get_len(char *string){
printf("len: %lu\n", strlen(string));
return 0;
}
int main(){
char *x = "test";
char y[4] = {'t','e','s','t'};
get_len(x); // len: 4
get_len(y); // len: 6
return 0;
}
Run Code Online (Sandbox Code Playgroud)
2个问题.为什么他们不同,为什么是6?多谢你们.
编辑:对不起,我知道会解决什么问题,我只是想了解发生了什么.那么strlen只是继续转发这个点,直到碰巧找到一个\ 0?此外,当我在主函数而不是get_len函数中执行strlen时,两者都是4.这只是巧合吗?
我将我的网站转移到新主机上.以前的php版本是5.2,现在是5.3.我更改了php版本后,几乎每个页面都显示警告:
strlen() expects parameter 1 to be string, array given
Run Code Online (Sandbox Code Playgroud)
错误行是此函数中的第三行:
function implodestr($arr,$field) {
unset($out_str);
if (!is_array($arr) || !$arr || strlen($arr)==0) return 0; //error line
foreach($arr as $k=>$v) {
$out_str.= $v[$field].",";
}
$str = trim($out_str,",");
$str ? "": $str=0;
return $str;
}
Run Code Online (Sandbox Code Playgroud) 我想用 PHP 计算字符串的长度。该字符串包含 HTML 实体编号,这会增加计算的字符数:–当我只想将其计为 1 时,破折号计为 7。
如何将 html 编号的实体转换为特殊字符仅计算长度为 1 的形式?
示例字符串:
Goth-Trad – ‘Cosmos’
Run Code Online (Sandbox Code Playgroud)
编码:
$string = html_entity_decode('Goth-Trad – ‘Cosmos’');
echo strlen($string);
Run Code Online (Sandbox Code Playgroud)
生成 '38',当我在寻找 '20' 时。出了什么问题?
strlen返回终止空字符前面的字符数.的实现strlen可能是这样的:
size_t strlen(const char * str)
{
const char *s;
for (s = str; *s; ++s) {}
return(s - str);
}
Run Code Online (Sandbox Code Playgroud)
此特定实现取消引用s,其中s可能包含不确定的值.它相当于:
int a;
int* p = &a;
*p;
Run Code Online (Sandbox Code Playgroud)
因此,例如,如果有人这样做(导致strlen输出不正确):
char buffer[10];
buffer[9] = '\0';
strlen(buffer);
Run Code Online (Sandbox Code Playgroud)
是不确定的行为?
我正在从我的字典中读取并打印出单词+单词的长度以用于测试目的.
我使用strlen来获取字符串的长度.但是,我得到的数字不正确.我相信strlen不计算\ 0字符.
我正在读字典中的前10个单词.我的预期输出应该是:
W:A L:1
W:A's L:3
W:AA's L:4
W:AB's L:4
W:ABM's L:5
W:AC's L:4
W:ACTH's L:6
W:AI's L:3
W:AIDS's L:6
W:AM's L:4
Run Code Online (Sandbox Code Playgroud)
但这就是我得到的(请注意L:如何在另一条线上.我认为这就是问题所在):
W:A
L:2
W:A's
L:4
W:AA's
L:5
W:AB's
L:5
W:ABM's
L:6
W:AC's
L:5
W:ACTH's
L:7
W:AI's
L:5
W:AIDS's
L:7
W:AM's
L:5
Run Code Online (Sandbox Code Playgroud)
以下是我的代码:
FILE* dict = fopen("/usr/share/dict/words", "r"); //open the dictionary for read-only access
if(dict == NULL) {
return;
}
int i;
i = 0;
// Read each line of the file, and insert the word in …Run Code Online (Sandbox Code Playgroud) 我找到了这段代码
int strlen_my(const char *s)
{
int len = 0;
for(;;)
{
unsigned x = *(unsigned*)s;
if((x & 0xFF) == 0) return len;
if((x & 0xFF00) == 0) return len + 1;
if((x & 0xFF0000) == 0) return len + 2;
if((x & 0xFF000000) == 0) return len + 3;
s += 4, len += 4;
}
}
Run Code Online (Sandbox Code Playgroud)
我很想知道它是如何工作的.¿任何人都可以解释它是如何工作的?
我知道获得const char长度的两种方法*
const char * str = "Hello World !";
int Size = 0;
while (str[Size] != '\0') Size++;
Run Code Online (Sandbox Code Playgroud)
和其他方式很简单
const char * str = "Hello World !";
size_t Size = strlen(str);
Run Code Online (Sandbox Code Playgroud)
但我不想使用str lib函数strlen,我认为这个函数也使用我的第一种方式行为.因为在PC世界中,当我们想要计算一些东西时,我们需要计算每个块的数量,并且没有魔法来获得一个运动的长度所以我认为第一种方式是获得长度的最佳选择const char *.换句话说,我认为第一种方式对于重型弦乐来说可能太重了.所以我很困惑.哪种方式更好,为什么其他方式不是?