我在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的程序。
答案 0 :(得分:2)
在C ++中执行终端I / O的首选方法是流。使用std::cin
和std::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 == "."))
}