转换 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"
就是说
- 动态设置字段宽度并打印所需数量
''
- 打印
|
- 动态设置字段宽度并打印所需数量
':'
- 打印
\
- 动态设置字段宽度并打印所需数量
':'
- 打印
/
- 动态设置字段宽度并打印所需数量
':'
- 打印
|
- 打印换行符
\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;
}
输出
|\::::::/|
|:\::::/:|
|::\::/::|
|:::\/:::|
|:::/\:::|
|::/::\::|
|:/::::\:|
|/::::::\|
我想了解 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"
就是说
- 动态设置字段宽度并打印所需数量
''
- 打印
|
- 动态设置字段宽度并打印所需数量
':'
- 打印
\
- 动态设置字段宽度并打印所需数量
':'
- 打印
/
- 动态设置字段宽度并打印所需数量
':'
- 打印
|
- 打印换行符
\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;
}
输出
|\::::::/|
|:\::::/:|
|::\::/::|
|:::\/:::|
|:::/\:::|
|::/::\::|
|:/::::\:|
|/::::::\|