2016-12-06 85 views
0

我在学习代码(特别是C)的最初阶段。 在写这计数为研究目的数组的字符函数,我质问自己(和我敢肯定这件事),如果是为了简化这个迭代的可能性:简化字符串迭代

int stringlength(char* s) 
{ 
    int i = 0; 

    while (s != NULL && *(s + i) != '\0') 
     i++; 

    return i; 
} 

我想要在迭代本身内保持i++(for循环?)。

我很欣赏你们给我的任何提示。如果你发现一些问题无关,我做错了 - 请让我知道。

+2

函数 – UnholySheep

+0

开始时可以将'!= NULL'的检查提取为'if'条件请注意,名称以'strx'开头的函数其中'x'是小写字母,它们是坏主意,名字的整个空间都是为标准库保留的。这个特殊的函数应该是安全的,但是因为我们已经有'strlen()'。 :) – unwind

+0

感谢提示:)想解压缩{s!= NULL},我只是出于性能原因(不检查数组中相同的每个字符)提取此检查吗? –

回答

-1

我建议使用指针算术。

首先,处理NULL大小写(空字符串,因此您只能得到空终止符)。否则,迭代指针并增加计数器。然后,只需返回该柜台。

int stringlength(char* s) 
{ 
    if (!s) return 0; 
    int len = 0; 

    while (*s++) len++; 

    return len; 
} 

(*s++)的神奇之处是什么? 那么这相当于*(s ++)!= 0。但是因为++的优先级高于*,所以括号是无用的。您可以看看这个thread

+0

非常感谢。你能告诉我为什么创建源指针的副本是有用/必要的吗?另外,如果你找到一些时间来解释一些情况,在这种情况下工作的“同时”条件究竟如何? * cp ++正在检查字符串中的“下一个”字符,但是为什么如果我没有检查“\ 0”,条件(* cp ++)发现到底? –

+0

@hiimvinzent我将编辑回复。确实,这里不需要该副本。 – Aif

+0

@YassineHoussni:你尝试过吗? – Aif

2
if(s == NULL) 
    return 0; 
int i; 
for(i = 0; s[i] != '\0'; i++); 

这应该解决你的目的,我相信。

编辑:添加空校验为输入char*因为NULL可能是一个可能的值。

1
int stringlength(char* s) 
{ 
    if (!s) 
     return 0; 
    int i = -1; 
    while(s[++i]!='\0'); 
    return i; 
} 
+0

请不要发布裸露代码的答案,也提供一些关于你的代码在做什么的评论。 –

0

我测试strlen(NULL)glibc,它导致Segment Fault,我认为这是合理的导致Segment Fault。因此,这里是我的实现:

#include <assert.h> 

int stringlength(const char* s) { 
    assert(s != NULL); 
    int i; 
    for (i = 0; s[i]; ++i); 

    return i; 
} 

注:sconst char *,但不char *