C ++无法获得strtok的用户输入

时间:2012-10-04 23:48:30

标签: c++ input strtok sentence

我在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]中的短语,但我无法弄清楚在不搞砸翻译的情况下启动输入的正确语法。

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

2 个答案:

答案 0 :(得分:2)

在C ++中执行终端I / O的首选方法是流。使用std::cinstd::getline函数从输入输出中读取字符串。

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

之后你可能想要摆脱strtok并查看这个question以了解如何在C ++中进行字符串标记化。

答案 1 :(得分: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 == "."))
}