2016-03-05 101 views
-3

如果我在for循環中使用strlen()會出什麼問題。對於在C中循環困惑

char s[i]; 
    for (int i = 0; strlen(s); i++) 

所以,如果我使用上層代碼,那就花了很多時間。 但是,如果我存儲的strlen的值,則檢查較高代碼花費的時間很少。

這些有什麼不同?

+1

您需要發佈循環做什麼來修改's'。如果將其長度更改爲「0」,則循環將結束。如果它不是它是無限的。無論如何,這是未定義的行爲,因爲's'是未初始化的。 –

+0

for(int i = 0; i user3528438

+0

爲什麼使用'i'來定義字符串的長度並控制循環?這是一個不同的'我'。請使用明智實施和明智命名的變量。 –

回答

2

您不應該使用i < strlen(s)作爲條件,因爲s中的字符串長度會在循環的每次迭代中得到重新計算。這是更好地使用單獨的變量,計算在初始化部分的長度:

for (size_t i = 0, len = strlen(s); i < len; i++) { 
    ... 
} 

請注意,您的s定義看起來像一個錯字:char s[i];。你指的是什麼變量i?在定義一個新的i變量的for循環開始之前它的值是什麼?

編輯

重新格式化您的代碼後,我意識到還有更多的困惑:

for (int i = 0; strlen(s); i++) 

for循環迭代只要字符串s不爲空。這是你的意圖嗎?你在循環中修改s嗎? s未初始化,測試調用未定義的行爲。你是否在初始化s的代碼中沒有發佈定義和for循環之間的代碼?如果這樣做,用這種方式編寫這樣一個循環仍然會更高效:

for (int i = 0; *s != '\0'; i++) 
1

在每次迭代循環之前評估條件。

C字符串只是一個字符數組,然後是一個NULL。因此,要計算一開始就必須從頭開始檢查每個角色的長度,直到找到NULL

所以在複雜性方面,strlen是O(n)。你的for也是O(n)。如果你每次檢查strlen那麼你的實現是O(n * n)。如果你堅持一下,那麼你就是O(n)。嘗試使用更長的s秒,以查看更大的差異。