2017-04-25 3 views
0

ich mit Umkehr meine Saiten von Ziffer 1 und 2umkehren einen String C++ ohne Reverse-Funktion

Jeder raten kann dementsprechend ein Problem haben?

Ich versuche, mit einem tempholder1 und tempholder2 als Funktionsvariablen und über for-Schleife umzukehren.

I cout << digit1 << digit2; // but do not get anything at the compiler.

Edited für eine bessere Effizienz

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <cstring> 
using namespace std; 

/* GLOBAL DECLARATIONS */ 

/* FUNCTIONS */ 

// Reverse the string 
void reverseString(string&); 
// Transfer all the digits in a char array to an integer array 
// Add two long integers 
// Print out the long integers 


int main() 
{  
    string digit1, digit2; 
    char again; // Y for menu 
    do 
    { 
     // Fetch Values 
     cout << "Enter a string of digits: "; 
     cin >> digit1; 
     cout << "Enter a string of digits: "; 
     cin >> digit2; 

     // Reverse the string 
     reverseString(digit1); 
     reverseString(digit2); 
     cout << digit1 << digit2; 
     // Return sum of both values 
     cout << "The sum is: "; 

     // Do it again? 
     cout << "Continue (Y/N)?: "; 
     cin >> again; 
    } while ((again=='y')||(again=='Y')); 
} 

// Reverse the string 
void reverseString(string& digit) 
{ 
    string tempholder1; 

    // tempholder1 = reverse of digit1 
    int k=0; 
    for(int i=digit.length()-1;i>=0;i--) 
    { 
     tempholder1[k]=digit[i]; 
     k++; 
    } 

    digit=tempholder1; 

} 
+3

Warum kehrt reverseString zwei Zeichenfolgen um, statt dass sie eine Zeichenfolge umkehren und sie dann zweimal aufrufen? –

+0

@TimB ich benutzte string & digit1, string & digit2 (als Referenz übergeben) und void statement. so sollte es in Ordnung sein, 2 gleichzeitig zu tun –

+0

Aber es ist immer noch eine schlechte Idee. Sie haben Code dupliziert und die Funktion weniger nützlich gemacht. (Was ist, wenn Sie 1 String oder 3 umkehren möchten?) –

Antwort

1

In Ihrem Reverse Funktion Initialisieren Sie nicht Ihre String-Variable, Wie groß ist die Größe der Zeichen, die es speichern kann? Wenn Sie dann durchgehen, greifen Sie auf einzelne Elemente dieser Zeichenfolge zu. Was ist, wenn tempholder1 nur eine Länge von 1 hat? Sie können nicht nur den zweiten Index auf sie zugreifen und ändern (da es ungültig sein könnte), der Grund, warum Sie Dinge wie schreiben:

myString = "SomeReallyLongString"; 

ist, weil der String-Operator = geschrieben wird die Anzahl der Zeichen zu erhöhen Shops.

so in Ihrer Funktion

// Reverse the string 
void reverseString(string& digit) 
{ 
    // Uninitialized variables are really bad!!! always always initialize 
    // string tempholder1; 
    string temphold = digit; 

    // tempholder1 = reverse of digit1 
    int k=0; 
    for(int i=digit.length()-1;i>=0;i--) 
    { 
     temphold[k]=digit[i]; 
     k++; 
    } 

    digit=temphold; 

} 
+1

Tatsächlich wird 'string temphold;' _is_ initialisiert, wobei der Standardkonstruktor von 'std :: string' verwendet wird. Das eigentliche Problem besteht darin, dass "temphold [k]" einen Zugriff außerhalb des Bounds ausführt (Ihre Kopierinitialisierung weist den benötigten Speicher zu). – cbuchart

+0

Zeichenfolge temphold = Ziffer; das löst es –

-1

einen String umkehren ich tun würde:

std::string name{"Hello World"}; 

    for(auto i = name.rbegin(); i != name.rend(); ++i){ 
    std::cout << *i; 
    } 
//Output: dlroW olleH 
0

Das Hauptproblem bei der Implementierung ist, dass Sie Speicher in der zeitlichen Zeichenfolge zuzuweisen vergessen haben, daher ist es nicht die Größe haben Sie erwarten.

Was ist mit einem In-Place-Reverse? Sie würden alles vermeiden, was mit der Verwendung einer temporären Zeichenfolge (Kopien, zusätzlicher Speicher ...) zusammenhängt.