For循环打印一个额外的逗号

时间:2014-03-28 01:53:46

标签: c++ for-loop

cout<<"Set B : {";
for(i=0;i<b;i++)
{
    cout<<setB[i];
    cout<<",";
}
cout<<" }"<<endl;

上面的代码打印不正确。它应该打印Set B:{1,2,3},但它打印一个额外的逗号==&gt;设置B:{1,2,3,}

任何帮助将不胜感激。提前谢谢!

9 个答案:

答案 0 :(得分:15)

使用

cout << "Set B : {";

for (i = 0; i < b; ++i) {
  if (i > 0) cout << ",";

  cout << setB[i];
}

cout << " }" << endl;

我改变了你的算法

在它出现之前:&#34;输入数字,然后加上逗号&#34;

现在意味着:&#34;如果我后面有一个号码,请输入一个逗号,然后输入数字&#34;

之前,您在打印数字时总是打印一个逗号,因此您有一个额外的逗号。

答案 1 :(得分:4)

对于for循环的每次迭代,程序将在for循环内执行-everything-。因此,您的循环将贯穿并打印您的集合中的每个数字,然后打印逗号。

问题在于即使在你最后一次循环运行时,它也会打印一个逗号,因为它是循环的一部分。

cout << "Set B : {";
for(i = 0; i < b; i++){
    cout << setB[i];
        if (i < (b-1))
            cout << ",";
}
cout << " }" << endl;

此代码将运行完全相同,除了它在循环中运行的倒数第二次,它不会打印逗号。没必要太花哨。 :)

答案 2 :(得分:2)

我个人更喜欢这个解决方案。首先打印出第一个元素,然后打印, [second element]

cout <<"Set B : {" << setB[0];
for(i = 1; i < b; i++)
{
    cout << ",";
    cout<<setB[i];
}
cout  << " }" << endl;

警告!:如果数组为空,则无效。

答案 3 :(得分:1)

循环代码打印一对数字和逗号。尝试使用这个:

cout<<"Set B : {";
for(i=0;i<b;i++)
{
    cout<<setB[i];
    if(i < b-1) cout<<",";
}
cout<<"}"<<endl;

答案 4 :(得分:1)

你正在循环执行cout&lt;&lt; &#34;&#34; 3次。以下将给出您想要的内容:

#include <iostream>

using namespace std;

int main(){

int setB[] = {1,2,3};

cout<<"Set B : {";
for(int i=0;i<3;i++)
{
    cout<<setB[i];
    if ( i < 2 )
        cout<<",";
}
cout<<" }"<<endl;

return 0;
}

答案 5 :(得分:1)

我经常处理这些循环的方式,你希望在项目列表之间放置空格或逗号之类的内容,如下所示:

int main()
{
    // initially the separator is empty
    auto sep = "";

    for(int i = 0; i < 5; ++i)
    {
        std::cout << sep << i;
        sep = ", "; // make the separator a comma after first item
    }
}

<强>输出:

0, 1, 2, 3, 4

如果你想提高速度效率,可以在进入循环之前使用if()输出第一项,输出其余项目,如下所示:

int main()
{
    int n;

    std::cin >> n;

    int i = 0;

    if(i < n) // check for no output
        std::cout << i;

    for(++i; i < n; ++i) // rest of the output (if any)
        std::cout << ", " << i; // separate these
}

答案 6 :(得分:1)

另一种方式,没有额外的分支:

std::cout << "Set B : {";
const char* sep = "";
for (const auto& e : setB) {
    std::cout << sep << setB[i];
    sep = ", ";
}
std::cout <<" }" << std::endl;

答案 7 :(得分:0)

如果您可以使用STL,请尝试以下操作:

#include <iterator>
#include <iostream>

int main() {
    int setB[]{1,2,3};
    std::cout << "Set B : { ";
    for(auto i = std::begin(setB), e = std::end(setB); i != e;) {
        std::cout << *i;
        for(++i; i !=e; ++i) { std::cout << ", " << *i; }
    }
    std::cout << " }" << std::endl;
    return 0;
}

答案 8 :(得分:0)

我真的很想推广使用range library来编写声明性代码而不是命令式样式的嵌套for-if语句。

#include <range/v3/all.hpp>
#include <vector>
#include <iostream>
#include <string>

int main()
{
    using namespace ranges;
    std::vector<int> const vv = { 1,2,3 };

    auto joined = vv | view::transform([](int x) {return std::to_string(x);}) 
                     | view::join(',');
    std::cout << to_<std::string>(joined) << std::endl;

    return 0;
}