转换 printf();声明 cout<<"";陈述。 C与C++

Converting a printf(); statement to a cout<<""; statement. C & C++

我想了解 printf() 但我只熟悉 C++ cout<< 语句,有人能翻译下面 printf() 语句的语法吗?我只是想了解这段代码中发生了什么。

void print_section(int n, int z){

    char dots[2*n+1];       // this makes a char array
    memset(dots,':',2*n+1); // this is similar to setfill()
    dots[2*n+1] = 0;

    for(int r = 0; r < n+1; r++){
        printf("%*.s|%.*s\%.*s/%.*s|\n",z-n,"",r,dots,2*(n-r),dots,r,dots);
    }
    for(int r = n; r >= 0; r--){
        printf("%*.s|%.*s/%.*s\%.*s|\n",z-n,"",r,dots,2*(n-r),dots,r,dots);
    }
}

printf() 是如何工作的?

如果您想完全了解printf()函数的工作原理,请参考:http://www.cplusplus.com/reference/cstdio/printf/

简单来说,"%*.s|%.*s\%.*s/%.*s|\n"就是说

  1. 动态设置字段宽度并打印所需数量''
  2. 打印|
  3. 动态设置字段宽度并打印所需数量':'
  4. 打印\
  5. 动态设置字段宽度并打印所需数量':'
  6. 打印/
  7. 动态设置字段宽度并打印所需数量':'
  8. 打印|
  9. 打印换行符 \n 以转到控制台中的下一行。

同样,你可以弄清楚"%*.s|%.*s/%.*s\%.*s|\n"会打印什么。

代码转换

假设您非常熟悉 C++。如果您使用 string class 会更好,因为您可以轻松地使用 substr() 成员函数来提取所需的 dots 子字符串进行打印。您可以从 here 了解 setw() 的工作原理。转换后的代码如下。

#include <iostream> // Input.Output
#include <string> // string class
#include <iomanip> // setw() function
int main(){
    const int n=3,z=6;
    std::string _dots(2*n+1,':');
    for(int r = 0; r < n+1; r++){
        std::cout<<std::setw(z-n)<<""<<"|"<<_dots.substr(0,r)<<"\"<<_dots.substr(0,2*(n-r))<<"/"<<_dots.substr(0,r)<<"|"<<std::endl;
    }
    for(int r = n; r >= 0; r--){
        std::cout<<std::setw(z-n)<<""<<"|"<<_dots.substr(0,r)<<"/"<<_dots.substr(0,2*(n-r))<<"\"<<_dots.substr(0,r)<<"|"<<std::endl;
    }
    return 0;
}

输出

   |\::::::/|
   |:\::::/:|
   |::\::/::|
   |:::\/:::|
   |:::/\:::|
   |::/::\::|
   |:/::::\:|
   |/::::::\|