3

認めざるを得ませんが、ポインターの使用方法がわかりませんが、それでも試してみました。私のプログラムの問題は、文字列が逆に表示されることです。ただし、最初の文字が欠落しており、文字列全体が 1 つ前のスペースに移動し、最初の要素が空白になっています。たとえば、「hello」と入力すると「olle」と表示されます。

#include <iostream>
#include <string>

using namespace std;

string reverse(string word);

int main()
{
char Cstring[50];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}

string reverse(string word)
{
    char *front;
    char *rear;
    for (int i=0;i< (word.length()/2);i++)
    {
            front[0]=word[i];
            rear[0]=word[word.length()-i];
            word[i]=*rear;
            word[word.length()-i]=*front;
    }
    return word;
}

新しいコードは完全に機能します。文字列を cstrings に変更しました。技術的にはcstringについて質問されましたが、文字列の方が簡単だと思うので、文字列を操作してから、必要な変更を加えてc文字列にします。リアとフロントも初期化する方法を見つけました。

#include <iostream>
#include <cstring>

using namespace std;

string reverse(char word[20]);

int main()
{
char Cstring[20];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}

string reverse(char word[20])
{
    char a='a';
    char b='b';
    char *front=&a;
    char *rear=&b;
    for (int i=0;i< (strlen(word)/2);i++)
    {
            front[0]=word[i];
            rear[0]=word[strlen(word)-1-i];
            word[i]=*rear;
            word[strlen(word)-1-i]=*front;
    }
    return word;
}
4

4 に答える 4

5
char *front;
char *rear;

じゃあ後で

front[0]=word[i];
rear[0]=word[strlen(word)-1-i];

良くない。初期化されていないポインターを逆参照すると、未定義の動作が呼び出されます。

それとは別に、あなたのコードは非常に複雑で、strlen()反復ごとに (さらには複数回) 呼び出しますが、これは不要であり、スワップ ロジックも不必要に複雑です。代わりに 2 つのポインターを使用してみてください。コードはよりクリーンになります。

void rev_string(char *str)
{
    char *p = str, *s = str + strlen(str) - 1;
    while (p < s) {
        char tmp = *p;
        *p++ = *s;
        *s-- = tmp;
    }
}

ただし、C++ では、生のポインターを使用する正当な理由はほとんどありません。std::reverse()代わりに使ってみてはどうですか?

string s = "foobar";
std::reverse(s.begin(), s.end());
于 2013-06-23T06:15:25.937 に答える
1
inline void swap(char* a, char* b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

inline void reverse_string(char* pstart, char* pend)
{
    while(pstart < pend)
    {
        swap(pstart++, pend--);
    }

}

int main()
{
    char pstring[] = "asfasd Lucy Beverman";
    auto pstart = std::begin(pstring);
    auto pend = std::end(pstring);
    pend -= 2; // end points 1 past the null character, so have to go back 2
    std::cout << pstring << std::endl;        
    reverse_string(pstart, pend);
    std::cout << pstring << std::endl;
    return 0;
}
于 2014-01-14T03:54:52.640 に答える