如何在循环中使用逗号分隔字符



我正在用c++编写一个程序,我正在尝试像这样分离字母:"A、 B、C";

但结果是这样的,我不知道为什么:";,A、 B、C";。

帮助?

我的代码如下:

#include <iostream>
#include <ctype.h>
using namespace std;

int main()
{


char startChar='Z';

char stopChar='A';

while (startChar>stopChar)

{

cin >> startChar;

startChar = toupper(startChar);


cin >> stopChar;

stopChar=toupper(stopChar);

}

for (char chLoop=startChar; chLoop<=stopChar; chLoop++)

{
if (stopChar > startChar)
cout << ",";


cout <<chLoop;
}

}

谢谢!

stopCharCstartCharA时,此条件将是true,因此在循环的每次迭代(包括第一次(中将打印,

if (stopChar > startChar)
cout << ",";

您可以通过将其更改为:来修复它

if (chLoop != startChar)
std::cout << ',';

也就是说,只有当chLoop而不是startChar时,才打印,

另一个根本不需要if的选项:

std::cout << startChar;         // print the first char before the loop
for (char chLoop = startChar + 1; chLoop <= stopChar; chLoop++) {
std::cout << ',' << chLoop; // now print the , unconditionally
}

Ted Lyngmo的答案是正确的。我只是想添加一些关于使用joiners(或分隔符(生成序列的有用信息。

C++中常见的习惯用法是打印第一个元素,然后打印准备好joiner的其余元素。例如:

char first = 'A';
char last  = 'Z' + 1;  // in C++, last/end is always _one past_
std::cout << first;
while (++first != last)
{
std::cout << "," << first;
}

一般来说,在开始之前,您还需要检查以确保至少有一个元素:

char first = 'A';
char last  = 'Z' + 1;  // in C++, last/end is always _one past_
if (first != last)     // make sure there is at least one item to print
{
std::cout << first;
while (++first != last)
{
std::cout << "," << first;
}
}

这适用于任何可以获得迭代器的序列:

std::vector xs = { 2, 3, 5, 7, 11 };
auto first = xs.begin();
auto last  = xs.end();
if (first != last)
{
std::cout << *first;
while (++first != last)
{
std::cout << "," << *first;
}
}

一切都是这样的变化。以下是一个有些人喜欢,有些人讨厌,但通常在std::stringstd::ostream上都能获得良好的性能:

if (first != last)
std::accumulate( std::next(first), last, *first, [&delimiter]( auto a, auto b )
{
return a.append( delimiter ).append( b );
} );

不过,C++不能把事情放在一边,程序员想要更小、更简单、更漂亮的代码。关于这个操作有一个完整的线程,Kikuko的回答为您提供了一个C++20 ranges_v3解决方案。