【问题标题】:For loop prints an extra commaFor 循环打印一个额外的逗号
【发布时间】:2014-03-28 01:53:45
【问题描述】:
cout<<"Set B : {";
for(i=0;i<b;i++)
{
    cout<<setB[i];
    cout<<",";
}
cout<<" }"<<endl;

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

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

【问题讨论】:

标签: c++ for-loop


【解决方案1】:

使用

cout << "Set B : {";

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

  cout << setB[i];
}

cout << " }" << endl;

我改变了你的算法

之前的意思是:“输入数字,然后输入逗号”

现在它的意思是:“如果我后面有数字,请输入逗号,然后输入数字”

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      警告!如果数组为空,这将不起作用。

      【讨论】:

      • +1 在这种情况下效果很好,但通常必须小心 - 如果setB 为空,setB[0] 将是未定义的行为。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你的循环正在执行 cout

        #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;
        }
        

        【讨论】:

        • 同意。我在这里列出的代码没有经过任何优化。只是为了澄清我的解释。
        【解决方案6】:

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

        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
        }
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            如果您可以使用 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;
            }
            

            【讨论】:

            • 它也打印了一个额外的逗号。
            • 不幸的是,这会在每个元素之后打印逗号。见ideone.com/yBb4QR
            • 有一个带有自定义迭代器的解决方案here
            • 有 std::experimental::ostream joiner 可以和 std::copy 一起使用来打印这个。
            【解决方案9】:

            我真的很喜欢提倡使用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;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-01-16
              • 1970-01-01
              • 2016-08-06
              • 2011-03-23
              • 2018-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多