2014-01-16 22 views
5

Ich möchte in der Lage sein, die Benutzereingabe zu nehmen und den gegebenen Buchstaben einen Wert zuzuweisen. Ich denke, ich habe diesen Teil runter, jetzt ist das Problem der Rückgabewert.Funktion gibt keinen Wert Ich will

#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; 
} 

, wenn ich die Gesamtzahl auf 0 zu erklären, ist die Rückkehr immer 0, aber wenn ich es nicht erklären, ich bekomme einen Rückgabewert von 229 .... etc Zufallszahl.

+0

abwechselnd, könnten Sie rufen 'http: // en.cppreference.com/w/CPP/Algorithmus/count' – billz

+0

Sie sollten nur die Funktion' int CH 2 N() schreiben 'oben 'int main()' anstatt eine Deklaration zu verwenden. – Hosch250

+0

Ich denke eher, Ihre Verwendung von string.find muss neu denken –

Antwort

4

Wenn Sie es nicht initialisiert werden (dessen Wert gesetzt), ist es nicht definiertes Verhalten mit und kann einen beliebigen Wert zurück - einschließlich 0

Typen ohne Konstruktor, wie int wird nur Speicherplatz zuweisen und haben einen Wert undefinedd im Allgemeinen basierend auf dem, was sich an diesem Ort von der vorherigen Verwendung befindet.

word.find nicht tut, was Sie denken, es tut, ist es für i in word

Sie wollen die Suche nur word[] verwenden: Auch

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

, könnte man std::endl am Ende setzen wollen von deinen cout Zeilen

+0

Wenn ich ein Wort zum Beispiel, den Buchstaben a oder das Wort Apple gebe ich immer noch den Rückgabewert von 0, wenn ich den Wert um 1 –

+0

das ist ein anderes erhöhen möchten Frage :) –

+0

alles andere, oder ist Ihre Frage beantwortet? –

8

Ich denke word.find(i) ist wahrscheinlich nicht das, was du da anrufen willst. Um auf ein bestimmtes Zeichen innerhalb der Zeichenfolge zuzugreifen, verwenden Sie eckige Klammern, z. B .: word[i] anstelle von word.find(i).

+2

Besser noch, verwenden Sie ' tolower (word [i]) == 'a'' anstelle von 'word.find (i) ==' a '|| word.find (i) == 'A'' – Hosch250

+0

haha, wie dumm von mir. Vielen Dank. –

+0

@ user2509848 danke, das ist viel besser als die Verwendung der oder Operator. –

0

Der Grund, dass Ihr Ergebnis zufällig ist, wenn Sie es nicht als 0 deklarieren, liegt daran, dass C++ und c in diesem Fall Daten nicht initialisieren. Wenn Sie eine Variable wie total deklarieren, ist der Anfangswert, was auch immer sich an diesem Ort im Speicher befindet. Es könnte wirklich alles sein. Initialisiere immer den Wert einer Variablen.

Ich denke, der Grund, warum Sie nichts Sinnvolles zurückgeben, ist, dass Sie falsch finden. std :: string :: find gibt keinen booleschen Wert zurück, wenn eine Position zurückgegeben wird. Daher möchten Sie überprüfen, ob gegen eine Zeichenfolgenposition, die besagt "das Zeichen existiert nicht in dieser Zeichenfolge". Das ist std :: string :: npos. Also, werden Sie wollen:

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

'word.find (i) == 'a'! = String :: npos' ergibt immer true, wenn' npos' nicht null oder eins ist.Da 'npos' nicht Null ist oder ein' total' wird immer inkrementiert. –

+0

Ja, du hast Recht. Ich meinte word.find ('a')! = String :: npos. Es sieht so aus, als ob er nur versucht hat, über die Charaktere zu iterieren. – Ben

+0

Wenn der Text "bbbbba" lautet, ist das Ergebnis 6, da jeder Aufruf von 'find' immer erfolgreich ist, da' a' am Ende der Zeichenfolge steht. Sie möchten nur das Zeichen am aktuellen Ort/Index von "i" überprüfen. –