如果我在for循環中使用strlen()
會出什麼問題。對於在C中循環困惑
char s[i];
for (int i = 0; strlen(s); i++)
所以,如果我使用上層代碼,那就花了很多時間。 但是,如果我存儲的strlen
的值,則檢查較高代碼花費的時間很少。
這些有什麼不同?
如果我在for循環中使用strlen()
會出什麼問題。對於在C中循環困惑
char s[i];
for (int i = 0; strlen(s); i++)
所以,如果我使用上層代碼,那就花了很多時間。 但是,如果我存儲的strlen
的值,則檢查較高代碼花費的時間很少。
這些有什麼不同?
您不應該使用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++)
在每次迭代循環之前評估條件。
C字符串只是一個字符數組,然後是一個NULL
。因此,要計算一開始就必須從頭開始檢查每個角色的長度,直到找到NULL
。
所以在複雜性方面,strlen是O(n)。你的for也是O(n)。如果你每次檢查strlen
那麼你的實現是O(n * n)。如果你堅持一下,那麼你就是O(n)。嘗試使用更長的s
秒,以查看更大的差異。
您需要發佈循環做什麼來修改's'。如果將其長度更改爲「0」,則循環將結束。如果它不是它是無限的。無論如何,這是未定義的行爲,因爲's'是未初始化的。 –
for(int i = 0; i
user3528438
爲什麼使用'i'來定義字符串的長度並控制循環?這是一個不同的'我'。請使用明智實施和明智命名的變量。 –