如何避免打印 cout 语句的终端 space

How to avoid printing terminal space of cout statement

我正在开发一个以相反顺序打印命令行参数的函数。代码有点不雅,我知道,但我只需要一些有用的东西:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {

    if (argc==1){
      cout <<"\n";
    }

    for (int str=argc; str-1; str--){
      cout <<argv[str-1]<<" ";

    }
      if(argc>1){
        cout<<"\n";
      }
    return 0;
}

因此,我的问题是:按照当前的编程,这会在打印每个命令行参数后打印出 space。但是,在打印最终命令行参数后,我不需要 space 。我将如何实现这一目标?我是否必须在 for 循环之后放入另一个 if 语句?

如果是基础问题请见谅;我搜索并找不到任何类似的东西。我现在只是在学习 C++ 的基础知识,我正在使用的当前教科书中没有任何帮助,因此我将不胜感激。预先感谢您的帮助!

Would I have to put in another if statement after the for loop?

是的。那将是最简单明了的方法。也许是这样的:

for (int str=argc; str>1; str--){
    cout << argv[str-1];
    if (str != 2)
        cout << " ";
}

不,您不一定需要 if 语句:

cout << argv[argc - 1];
for (int str = argc - 1; str > 1; str--)
{
    cout << " " << argv[str - 1];
}

虽然这是我的第一选择。

如果:

for (int str = argc; str > 1; str--)
{
    if(str > 2) cout << argv[str - 1] << " ";
    else cout << argv[str - 1];
}    

再有一个 if 有什么问题?

...
for (int str=argc; str-1; str--){
    cout << argv[str-1];
    if (str>2) cout << " ";
 }
...

您跳过 if statements(除非您打算在其中做一些非常具体的事情)。

当您不提供任何命令行参数时,for 循环(连同三元运算符)本身会处理这种情况。如果没有命令行参数,for 循环 str > 1 中的第二个参数将为 false(因为 argc 将为 1)。所以你也可以得到同样的东西:

int str;
for (str=argc; str > 1; str--)
    (str > 2)?cout<< argv[str-1]<<" " :cout<<argv[str-1]<<"\n";

如果你仍然想用 if 语句来做,你实际上可以这样做

   int str; 
   if(argc==1)      //if argc equals 1
       cout <<"\n";
   else             //this would also include the argc > 1 cases.
    {
       for (str=argc; str > 1; str--) 
           cout <<argv[str-1]<<" ";  //print n-1 characters within the loop
       cout<<argv[str-1]<<"\n";  //and last one outside the for loop
    }

我想我会以稍微不同的方式编写代码。我想我会使用更接近于此的东西:

#include <iostream>
#include <vector>
#include "infix_iterator.h"

int main(int argc, char **argv) {
    std::vector<char *> args {argv+1, argv+argc};

    if (args.empty())
        return 1;

    std::cout << "\n";           
    std::copy(args.rbegin(), args.rend(),
              infix_ostream_iterator<char *>(std::cout, " "));
    std::cout << "\n";      
}

这使用了我在 a question on CodeReview 中发布的 infix_ostream_iterator,这使得很多类似的任务变得更加容易。