如何使用逗号在循环中分割字符?
How to use commas to split chars in a loop?
我正在用 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;
}
}
谢谢!
当stopChar
为C
且startChar
为A
时,此条件将为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
}
是正确的。我只是想添加一些有关使用 joiners(或 separators)生成序列的有用信息。
C++ 中常用的习惯用法是先打印第一个元素,然后打印带有连接符前缀的剩余元素。例如:
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::string
和 std::ostream
上表现良好:
if (first != last)
std::accumulate( std::next(first), last, *first, [&delimiter]( auto a, auto b )
{
return a.append( delimiter ).append( b );
} );
C++ 不能放任自流,程序员需要更小、更简单、更漂亮的代码。关于此操作有一个完整的线程,Kikuko’s answer gives you a C++20 ranges_v3 solution。
我正在用 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;
}
}
谢谢!
当stopChar
为C
且startChar
为A
时,此条件将为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
}
C++ 中常用的习惯用法是先打印第一个元素,然后打印带有连接符前缀的剩余元素。例如:
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::string
和 std::ostream
上表现良好:
if (first != last)
std::accumulate( std::next(first), last, *first, [&delimiter]( auto a, auto b )
{
return a.append( delimiter ).append( b );
} );
C++ 不能放任自流,程序员需要更小、更简单、更漂亮的代码。关于此操作有一个完整的线程,Kikuko’s answer gives you a C++20 ranges_v3 solution。