2013-10-14 142 views
1

我是C++中的新成員,遇到了一個我不知道該怎麼做的問題。當我遇到下面這段代碼時,我正在書中做一些例子。for循環中的數組索引

for(int i=0;string[i];i++){ 
    cout<<string[i]; 
} 

這裏,而不是對人給予index.Based對方法我跑到下面的代碼,但沒有奏效數組的第二個參數一個布爾值。

char string[50] ="This is a test!"; 

for(int i=sizeof(string)-1;string[i];i--){ 
    cout<<string[i]; 
} 

cout<<"\n"; 

我調試它和「字符串[我]」有0,所以我的問題是價值,

  1. 爲什麼使用,而不是一個布爾數組索引(是OK ?)。
  2. 爲什麼我的第二段代碼沒有工作。

在此先感謝。

+1

字符串(和字符串一般)以0結尾。 – chris

回答

6

布爾測試string[i]實際上只是檢查是否遇到空字符('\0')。 C中的所有字符串都以空字符結束,所以這適用於通過字符串進行正向迭代。但是,如果你要反過來,則不行。您應該檢查,而不是i大於或等於零。

此外,sizeof(string)返回數據類型的大小(50字節或更多),而不是它包含的字符串的長度。要獲得字符串的長度,使用strlen

for(int i = strlen(string) - 1; i >= 0; i--) { 
    cout << string[i]; 
} 

我建議不要叫你的變量string,因爲這是在標準庫中的數據類型,並且是混亂的C++程序員,如果你把它作爲一個變量名。特別是因爲人們通常導入整個std命名空間,並將字符串類稱爲string

這就像調用所有數值「整數」。這樣做實際上並沒有告訴程序員它用於什麼,只是它的類型。請使用更多描述性變量名稱=)

+1

小東西:字符串數組不是字符串類 – Cramer

+0

我同意變量名稱,但由於這是一個測試,我沒有注意任何名稱。無論如何,當我使用strlen時,數組會繼續爲值,爲什麼? – Madz

+1

我不太明白你在那裏說什麼,@Madz - 你的意思是說'我'具有負值?也許編輯你的問題,並顯示一些輸出,演示你所看到的,以及代碼重現。 – paddy

1

在上面的for循環中,使用了char而不是bool作爲第二個參數。在這種情況下,非零值被認爲是「真」,零值被認爲是「假」。

在第二個代碼中,由於string [sizeof(string)-1]爲零並且它被評估爲「false」,for循環未執行。

如果您通過以下方式使用,您的代碼將工作

for(int i=0;string[i];i++){ 
1

由於這是C++,不C,你可以使用內置的字符串類,而不是使用字符數組會更好。

下面是字符打印出你的字符串,角色的逆一種方法:

#include <iterator> 
... 
typedef std::reverse_iterator<std::string::iterator> rev_iter; 

string str("This is a freaking test!"); 
for(rev_iter it (str.end()); it != rev_iter(str.begin()); ++it) 
    std::cout << *it; 
std::cout << endl; 

而另一家(但修改字符串):

#include <algorithm> 
... 
string str("This is a freaking test!"); 
reverse(str.begin(), str.end()); 
cout << str << endl;