2016-12-06 92 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 *