2014-01-16 28 views
5

我希望能夠接受用戶輸入併爲給定的字母賦值。我想我已經把那部分放下了,現在問題正在返回價值。函數不返回值我想

#include <iostream> 
#include <string> 
using namespace std; 

int ch2n(string word); 

int main() 
{ 
    string inputWord; 

    cout << "Type Word: "; 
    cin >> inputWord; 
    cout << ch2n(inputWord); 
} 

int ch2n(string word) 
{ 
    int total = 0; 
    for(int i = 0;i != word.size(); i++) 
    { 
     if(word.find(i) == 'a' || word.find(i) == 'A') 
     { 
      total += 1; 
     } 
    } 
    return total; 
} 
時,我總申報0

,回報始終是0,但如果我不聲明它,我得到的229返回值....等隨機數。

+0

交替,你可以調用'HTTP:// en.cppreference.com/W/CPP /算法/ count' – billz

+0

你應該只寫函數'INT N()上面的' 'int main()'而不是使用聲明。 – Hosch250

+0

我寧願認爲你使用string.find需要重新思考 –

回答

4

如果不進行初始化(設置它的值),使用它是不確定的行爲,並且可以返回任何隨機值 - 包括0

類型,而構造,像int只會分配空間,並有undefinedd值,通常根據之前使用該地點的情況而定。

word.find不會做你認爲這樣做,是在word

尋找i你想只用word[]

if(word[i] == 'a' || word[i] == 'A') 

而且,你可能想要把std::endl末你的cout

+0

例如,當我輸入一個單詞時,字母a或單詞Apple仍然得到0的返回值,當我想將該值增加1 –

+0

這就是不同的問題:) –

+0

什麼,或者你的問題是回答? –

8

我認爲word.find(i)可能不是你想要在那裏打電話。要訪問字符串中的特定字符,請使用方括號,即:word[i]而不是word.find(i)

+2

更好的是,使用' tolower(word [i])=='a''而不是'word.find(i)=='a'|| word.find(i)=='A'' – Hosch250

+0

哈哈,我真是無聊。非常感謝你。 –

+0

@ user2509848謝謝你,這比需要使用or運算符要好得多。 –

0

如果你沒有聲明它爲0,你的結果是隨機的原因是因爲C++和c在這方面不會初始化數據。如果你聲明一個變量,比如total,那麼初始值就是那個地方在內存中發生的任何事情。這真的可以是任何事情。始終初始化變量的值。

我認爲你沒有返回任何有意義的原因是因爲你使用的是錯誤的。 std :: string :: find不返回一個布爾值,如果返回一個位置。因此,您想要檢查是否對字符串位置寫有「該字符不存在於此字符串中」。這是std :: string :: npos。所以,你會想:

if(word.find('a') != string::npos || word.find('A') != string::npos){ 
     total += 1; 
    } 
+0

'word.find(i)=='a'!= string :: npos'如果'npos'不爲零或一個,將始終爲真。由於'npos'不是零,或者'total'總是遞增。 –

+0

是的,你是對的。我的意思是word.find('a')!= string :: npos。看起來他只是試圖迭代人物。 – Ben

+0

如果文本是「bbbbba」,結果將是6,因爲每個對'find'的調用總是成功,因爲'a'在字符串的末尾。你只想在'i'的當前位置/索引處檢查字符。 –