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");
}

我实际上希望我的程序用户生成要放入 char 短语 [100] 的短语,但我无法弄清楚在不搞砸翻译的情况下启动输入的正确语法。

这是一个将短语翻译成猪拉丁语的程序。

4

2 回答 2

2

在 C++ 中进行终端 I/O 的首选方式是流。使用std::cinstd::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 回答