1

我的问题与类似,但我不想为此使用库。

想象一下,我们有一个要输出的名称数组。

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i];
}

输出:PeterMaxJackDanielLuke

这不完全是我们所说的用户友好,所以让我们在名称之间输出逗号。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << ", ";
}

输出:Peter, Max, Jack, Daniel, Luke,

问题是结束逗号。我if可以检查每个循环for是否是最后一个元素,但这似乎不是一个干净的解决方案。

在不使用库的情况下在元素之间插入逗号的最佳方法是什么?

4

4 回答 4

5

首先,您的代码中有一个错误,sizeof(names)会产生错误的值。

为了在正确的位置获得逗号,常规方法如下:

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
bool first = true;

for(auto const& name : names) {
    if (first)
        first = false;
    else
        cout << ", ";
    cout << name;
}

或者,如果您不使用 C++11:

for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); ++i) {
    if (i > 0)
        cout << ", ";
    cout << names[i];
}

但是这个:

在不使用库的情况下在元素之间插入逗号的最佳方法是什么?

是态度不对。只有在使用库时,C++ 才能很好地工作。没有库,C++ 是一门糟糕的语言。或者,用 Stroustrup 的话来说:

如果没有一个好的库,大多数有趣的任务都很难在 C++ 中完成;但是如果有一个好的库,几乎任何任务都可以变得简单。

于 2012-06-16T13:20:47.903 回答
4

使用boost::join

std::cout << boost::join(names, ", ") << "\n";

因为重写函数没有意义……尽管它确实很简单。

于 2012-06-16T16:15:06.180 回答
2

为什么不简单:

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
int i;

for (i = 0; i < sizeof(names) / sizeof(names[0]) - 1; i++)
{
    cout << names[i] << ", "; 
}   
cout << names[i];

这就是我通常做的。

于 2012-06-16T13:35:51.220 回答
1

这不是一个干净的解决方案,但它是唯一的解决方案。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << (i==sizeof(names)-1)?"",", ";
}
于 2012-06-16T13:21:22.127 回答