2017-04-25 44 views
0

我與我的倒車數字1和2反轉字符串C++無反向功能

任何的字符串可以相應地通知有問題嗎?

我想通過tempholder1和tempholder2作爲函數變量並通過for循環來反轉。

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

編輯,以便提高效率

#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

爲什麼reverseString反向兩個字符串,而不是它扭轉一個字符串,然後調用它兩次? –

+0

@TimB我用string&digit1,string&digit2(通過引用傳遞)和void語句。所以它應該罰款2在同一時間 –

+0

但它仍然是一個壞主意。你已經重複了代碼,並且使得該函數不太常用。 (如果你想要反轉1個字符串,或者3?) –

回答

1

在你reverseString功能你是不是初始化你的字符串變量,這樣它可以存儲的字符的大小是多少?然後,當你瀏覽你正在訪問該字符串的單個元素時,如果tempholder1只有1的長度,該怎麼辦?你不能只是進入第二個索引,並改變它(因爲它可能是無效的),你可以寫東西喜歡它的原因:

myString = "SomeReallyLongString"; 

是因爲字符串操作=寫入字符增加的數量就商店。

所以在你的函數

// 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

實際上,'string temphold;'_is_初始化,使用'std :: string'的默認構造函數。實際的問題是'temphold [k]'執行一個超出邊界的訪問(你的副本初始化分配了所需的內存)。 – cbuchart

+0

string temphold = digit;這解決了它 –

-1

扭轉一個字符串我會做:

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

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

在實施的主要問題是,你忘了在時間字符串分配內存,因此它並沒有你期待的大小。

原位反轉怎麼樣?你會避免與使用時間串的一切(副本,額外的內存...)

void reverseString(std::string& str) 
{ 
    const size_t n = str.length(); 
    for (size_t i = 0; i < n/2; ++i) { 
    std::swap(str[i], str[n - i - 1]); 
    } 
}