0

私はC++でこのコードの問題に遭遇し続けます:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

using namespace std;

int main ()
{
   string words[25];
   int i = 0;
   char * word;
   cout << "Input a phrase, no capital letters please.";
   char phrase[100] = "this is a phrase";
   word = strtok (phrase, " ,.");

   while (word != NULL)
   {
      i++;
      words[i] = word;
      cout << words[i] << " ";
      word = strtok (NULL, " ,.-");
      int g = 0;
   }
   cout << endl << endl;

   int g = 0;
   while (g < i)
   {
      g++;
      char f = words[g].at(0);
      if ((f == 'a') || (f == 'e') || (f == 'i') || (f == 'o') || (f == 'u') || (f == 'y'))
      {
         words[g].append("way");
         cout << words[g] << " ";
      }
      else
      {
         words[g].erase (0,1);
         cout << words[g] << f << "ay" << " ";
      }

   }
   cout << endl;
   system("PAUSE");
}

私は実際にプログラムユーザーにcharphrase[100]に入れるフレーズを生成してもらいたいのですが、翻訳を台無しにせずに入力を開始するための適切な構文を理解することはできません。

これは、フレーズをピッグラテン語に変換するプログラムです。

4

2 に答える 2

2

C++ で端末 I/O を行うための推奨される方法は、ストリームです。std::cinおよびstd::getline関数を使用して、入力出力から文字列を読み取ります。

std::string input;
std::getline(std::cin, input);

strtokその後、おそらくこの質問を取り除き、C++ で文字列のトークン化を行う方法を理解することをお勧めします。

于 2012-10-04T23:58:56.560 に答える
2

あなたが望むものは:

char phrase[100];
fgets(phrase, 100, stdin);

ただし、コメントやその他の回答に記載されているように、C++ で C 文字列関数を使用していますが、これは非常に奇妙です。任務か何かで要求されない限り、そうすべきではありません。

代わりに次を使用します。

string input;
getline(cin, input);

トークン化するには、次のことができます。

string token;
size_t spacePos;
...
while(input.size() != 0)
{
    spacePos = input.find(" ");
    if(spacePos != npos)
    {
        token = input.substr(0, spacePos );
        input = input.substr(spacePos  + 1);
    }
    else
    {
        token = input;
        input = "";
    }

    // do token stuff
}

または、そのジャズをすべてスキップするには:

string token;

while(cin >> token)
{
    // Do stuff to token
    // User exits by pressing ctrl + d, or you add something to break (like if(token == "quit") or if(token == "."))
}
于 2012-10-05T00:05:24.963 に答える