2017-09-27 13 views
-3

文字列を受け取る関数を作成しようとしていますが、これはすべてmainで行われています。ここに私がこれまで持っているものがあります。Cスタイルの文字列に変換する

#include <cstring> 
#include <iostream> 
#include <string> 


std::string str = "zombie"; 


void Reverse(std::string a) 
{ 

    char* a1 = a.c_str; 
    char* a2; 

    for (int i = (strlen(a1) -1); a1[i]!=0; i--) 
    { 
     a2 += a1[i]; 
    } 

    str = a2; 
} 

int main() 
{ 
    Reverse(str); 

    std::cout << str << std::endl; 
} 

でも、このエラーが発生します。私はこの質問にポインタを利用することはできません。助言がありますか?

EDIT:特に、挿入されたパラメータaをCスタイルの文字列に変換する際に問題があります。

EDIT 2:それで、私はちょっとした掃除を始めました。私の理解によれば、私が持っていたコードは、適切な変更を加えても、私の目標を達成できませんでした。これはより良い進路になるだろうか?関数に渡す前に文字列をCスタイルに変換するだけです。

void Reverse(const char* s) 
{ 
    int x = strlen(s); 
    std::string str = ""; 

    for (int c = x; c > 0; c--) 
    { 
     str += s[c]; 
    } 

} 

答えて

0

この機能は完全に無効です。

たとえば、パラメータはstd::string &と宣言する必要があります。

関数がグローバル変数に依存する場合は、悪い考えです。このステートメントで

char* a1 = a.c_str; 

2つのエラーを一度にあります。まずa.c_strの代わりにa.c_str()が必要です。そして、メンバ関数c_strは定数ポインタを返します。

このポインタ

char* a2; 

は不定値を有します。

今まで、関数がC++でどのように記述できるかについては分かっていないので、実装のいくつかのバリエーションを示します。

最も単純な関数はclass std::stringの逆イテレータを使用して、以下の

#include <iostream> 
#include <string> 

std::string & Reverse(std::string &s) 
{ 
    s.assign(s.rbegin(), s.rend()); 

    return s; 
} 


int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

あります。

別のアプローチでは、ループを使用して機能を自分で書きたい場合は、その実装がで

#include <iostream> 
#include <string> 


std::string & Reverse(std::string &s) 
{ 
    for (std::string::size_type i = 0, n = s.size(); i < n/2; i++) 
    { 
     //std::swap(s[i], s[n - i - 1]); 
     char c = s[i]; 
     s[i] = s[n - i - 1]; 
     s[n - i - 1] = c; 
    } 

    return s; 
} 

int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

のように見えることができますヘッダで宣言された標準アルゴリズムstd::reverse<algorithm>

#include <iostream> 
#include <string> 
#include <algorithm> 

std::string & Reverse(std::string &s) 
{ 
    std::reverse(s.begin(), s.end()); 

    return s; 
} 

int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

を使用することですすべての3つの場合、プログラム出力は次のようになります。

zombie 
eibmoz 

インデックスの代わりにイテレータ(双方向またはランダム)を使用して、自分で関数を記述することもできます。

関連する問題