2016-10-26 4 views
0

文字の配列を逆の順序で他の文字配列にコピーしようとしています。C++の複雑なこと

これは私の方法である:

ここ
void reversString(char* str){ 
    char* ptr = str; 

    int i = 0; 
    // getting length of str/ptr array 
    while (*(ptr + i) != '\0'){ 
     i = i + 1; 
    } 

    char revStr [i]; 
    char * revStrChar = &revStr[0]; 
    int revStrPos = 0; 

    cout << *(ptr + 3) << endl; 

} 

私は通常の順序でそれをコピーしようとしていますが、私は入力(「ABCD」)の最後の文字を印刷する場合、ナッシングが起こります。空行のみを出力します。

しかし、私は新しいchar配列の宣言削除する場合:

void reversString(char* str){ 
    char* ptr = str; 

    int i = 0; 
    // getting length of str/ptr array 
    while (*(ptr + i) != '\0'){ 
     i = i + 1; 
    } 

    //char revStr [i]; 
    //char * revStrChar = &revStr[0]; 
    //int revStrPos = 0; 

    cout << *(ptr + 3) << endl; 

} 

が、それは正しく最後の文字を印刷し、「D」です。私は、新しいchar配列の宣言が出力にどのように影響するのか理解していません! (コンパイラはminGW、OSはWin10)

+3

'文字revStr [i]は、'どこ 'i'は、コンパイル時の定数は、標準C++ではないではありませんこれはコンパイラの拡張機能です。 – TartanLlama

+0

私は1で始めるべきではありません、revStr定数で '\ 0'のスペースを数えていますか? 'strlen'を使って' str'のサイズを数えてみませんか?そして、あなたがポインタ操作を使っているのなら、 'str'を使って' revStr'を宣言してみてはどうでしょうか? 'char * revStr = malloc(sizeof(str));' – TomasCarvalho

+0

'strlen'を使ってください。代わりに、 'std :: string'を使用してください。あるいは単に 'std :: reverse'を使い、この関数を全く書かないでください。 – TartanLlama

答えて

2

あなたはC++ 11のタグを付けました。 。 。なぜ実際にそれをより近代的なSTLの仕方をしない:

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


int main() 
{ 
    std::string str{"12345abc"}; 
    std::string copy = str; 
    std::reverse(copy.begin(), copy.end()); 

    std::cout << copy << std::endl; 

    return 0; 
} 

は出力:

cba54321 
+0

答えをありがとう!問題は、C++コースからの演習であり、残念ながらポインタ演算のみを使用することです。 – TheSlawyan

+2

これは、6番目のコンストラクタ(ここにリストされています)(http://en.cppreference.com/w/cpp/string/basic_string/basic_string)を使用して2行に短縮できます( 'std :: reverse'関数呼び出しを削除できます) )、逆方向イテレータ。 –

+2

@スラウィンは、すべての時間を無駄にするのを避けるために、その情報を質問に入れるべきです。 – UKMonkey

関連する問題