0

これは宿題のように見えますが、宿題ではありませんのでご安心ください。C++ コースで使用する本の練習問題として、ポインターを先読みしようとしています。

この本の演習では、文をトークンに分割し、それぞれを豚ラテン語に変換してから表示するように指示されています..

pig latin は基本的にこのようになっています: ball は allboy in piglatin.. boy は oybay になります.. 最初の文字を取り出し、最後に置き、「ay」を追加します.

これまでのところ、これは私が持っているものです:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <cstring>
using std::strtok;
using std::strcat;
using std::strcpy;

void printPigLatin( char * );

int main()
{
    char sentence[500];
    char *token;

    cout << "Enter string to tokenize and convert: "; 
    cin.getline( sentence, 500 );

    token = strtok( sentence, " " );

    cout << "\nPig latin for each token will be: " << endl;

    while( token != NULL ) 
    {
        printPigLatin( token );
        token = strtok( NULL, " " );
    }

    return 0;
}

void printPigLatin( char *word )
{
    char temp[50];

    for( int i = 0; *word != '\0';  i++ )
    {
        temp[i] = word[i + 1];
    }

    strcat( temp, "ay" );
    cout << temp << endl;
}

トークン化の部分は非常に明確に理解していますが、豚のラテン語を行う方法がわかりません..単に「ay」をトークンに追加することから始めて、結果がどうなるかを確認しようとしました..なぜプログラムが入るのかわかりません無限ループと「ayay」を表示し続けます..何かヒントはありますか?

編集:これは現在正常に動作しますが、「ay」を追加する前にトークンの最初の文字を追加する方法がわかりません

編集:これは私がそれを「見る」方法ですが、正しく実装する方法がわかりません..

4

5 に答える 5

1

正直なところ、あなたの例から判断すると、私は C++ の本の質をひどく疑っています。C++ の「基本的なもの」は、C ポインター スタイルのプログラミングではありません。むしろ、高レベルのライブラリ機能を適用しています。「On Freund」が指摘したように、C++ 標準ライブラリは、タスクに取り組むための優れた機能を提供します。より優れた C++ 書籍の推奨事項を検索することをお勧めします。

問題に関して:printPigLatin既存の関数を使用できますstrcpy(またはstrncpy、バッファ オーバーフローに関してより安全です)。i + 1st 位置を使用しているため、手動コピーでは入力の最初の文字が省略されています。また、常に同じ (最初の) 文字をテストする壊れたループ状態もあります。さらに、とにかくオーバーフローが発生するはずです。

于 2009-05-12T06:47:14.623 に答える
1

入力文字列を strcat で実行しています。トークンごとに新しい文字列を作成してトークンと「ay」をコピーするか、単にトークンを出力してから「ay」を出力する必要があります。ただし、C++ を使用している場合は、istream イテレータと STL アルゴリズムを使用してみませんか?

于 2009-05-12T06:15:07.720 に答える
0

私の前の人々が指摘したように、あなたがやりたいことを達成するための他のいくつかの方法があります。

ただし、コードの実際の問題はstrcatの使用にあるようです。編集で、少し変更したようです。これは、最初のものがchar*とサイズの問題で機能しなかった理由の説明です

基本的に、ポインタは、提供された文字列に「ay」を追加するのに十分なメモリを割り当てません。リンクに示されている手法を使用してポインタを作成すると、正常に機能するはずです。

私はあなたのプログラムを動作させ、strcatを取り出して使用しました

cout << word << "ay" << endl

于 2009-05-12T06:55:30.977 に答える
0

*word != '\0' のため、ループは無限です。

ワード ポインタは、ループ内で変更されることはありません。

于 2009-05-12T07:09:43.840 に答える
0

これはうまくいったようです:

void printPigLatin( char *word )
{
    cout << word + 1 << word[0] << "ay" << endl;
}

それをするのが良い考えかどうかはわかりません。

于 2009-05-12T22:46:44.323 に答える