问题描述
所以我正在尝试做这样的事情:
输入:
hi my name is clara
预期输出:
hi,my,name,is,clara
我的程序如下:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin,str);
istringstream ss(str);
do {
string word;
ss >> word;
cout << word << ",";
}
while (ss);
}
但是输出看起来像这样
hi,clara,
有人可以帮我解决这个问题吗?
解决方法
这应该解决它:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str;
getline(cin,str);
string word;
istringstream ss(str);
bool firstIteration = true;
while(ss >> word) {
if(!firstIteration) {
cout << ",";
}
cout << word;
firstIteration = false;
};
}
请检查正在运行的演示here。
我在许多编程语言中使用了这个惯用法(模式?),在所有类型的任务中,您都需要从列表(如输入)构造定界输出。让我用伪代码给出摘要:
empty output
firstIteration = true
foreach item in list
if firstIteration
add delimiter to output
add item to output
firstIteration = false
在某些情况下,甚至可以完全省略firstIteration
指标变量:
empty output
foreach item in list
if not is_empty(output)
add delimiter to output
add item to output
,
如果您希望每次执行while循环时都没有if子句的解决方案。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str;
getline(cin,str);
string word;
istringstream ss(str);
string delimiter = "";
while(ss >> word) {
cout << delimiter << word;
delimiter = ",";
};
}
,
一旦到达operator>>
的末尾istringstream
无法读取单词,从而使word
变量为空,您将无法处理。您正在输出word
,然后检查读取是否实际成功。这就是为什么您在输出的末尾以空白词结尾的原因。您需要检查该情况,例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin,str);
istringstream ss(str);
do {
string word;
if (!(ss >> word)) break;
cout << word << ",";
}
while (true);
}
或者:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin,str);
istringstream ss(str);
string word;
while (ss >> word)
{
cout << word << ",";
}
}
但是,无论哪种方法,最后一个单词的末尾仍会带有逗号。
您可以使用变量来控制何时输出逗号,例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin,str);
istringstream ss(str);
string word;
bool first = true;
while (ss >> word)
{
if (first)
first = false;
else
cout << ",";
cout << word;
}
}
但是,在这种情况下,简单地自己输出第一个单词,然后进入循环以输出其余以逗号为前缀的单词会更干净,例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin,str);
istringstream ss(str);
string word;
if (ss >> word)
{
cout << word;
while (ss >> word)
{
cout << "," << word;
}
}
}