While()循环在文本周围创建一个星号边框?

时间:2013-08-01 08:11:51

标签: c++

好吧,我是编程新手,决定跳进这本名为Accelerated C ++的书。我只是在第二章,我尝试了练习,即创建一个程序,询问你的名字,然后用它周围的框架和填充输出。

当我执行它时,它似乎没有移动到下一行。我猜它与我的while()循环有关,但我太笨了,无法弄清楚究竟是什么

// ask for a person's name, and greet the person
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::string;

int main()
{
// fetch name
cout << "Please enter your first name: ";
string name;
cin >> name;

// message
const string greeting = "Hello, " + name + "!";
// padding
const int pad = 1;
//desired rows/columns
const int rows = pad * 2 + 3;
const string::size_type cols = greeting.size() + pad * 2 + 2;
// seperate output from input
cout << std::endl;
// invariants
int r = 0;
string::size_type c = 0;

while (r != rows) {
    while(c != cols) {
        if (r == 0 || r == rows -1 || c == 0 || c == cols -1) { // if in bordering column or row
            cout << "*";   //output *
        } else {
            if (r == pad + 1 && c == pad + 1) { //if on row for greeting
                cout << greeting; // write greeting
                c += greeting.size(); // adjust invariant
            } else {
                cout << " ";
            }
        }
        ++c;
    }
    ++r;
    cout << std::endl;
}

return 0;
}

4 个答案:

答案 0 :(得分:5)

考虑将列计数器c移动到您使用它的位置,然后就像塔克米所说的那样,它将从每行的0开始。

while (r != rows) {
    string::size_type c = 0;
    while(c != cols) {

答案 1 :(得分:4)

在外部循环的底部,您需要将变量c重置为零,否则它将保留其旧值,并且不会重新进入内部循环。

实现此目的的一个好方法是将变量的定义/初始化移动到外部循环的开头。这样c将在每次启动内循环之前重新初始化。

答案 2 :(得分:1)

你快到了。

你需要清除每一行的c,你需要从greetings.size()中取一个以使其格式正确(考虑到你将在循环中稍后递增它)

// ask for a person's name, and greet the person
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::string;

int main()
{
// fetch name
cout << "Please enter your first name: ";
string name;
cin >> name;

// message
const string greeting = "Hello, " + name + "!";
// padding
const int pad = 1;
//desired rows/columns
const int rows = pad * 2 + 3;
const string::size_type cols = greeting.size() + pad * 2 + 2;
// seperate output from input
cout << std::endl;
// invariants
int r = 0;


while (r != rows) {
string::size_type c = 0;
while(c != cols) {
   if (r == 0 || r == rows -1 || c == 0 || c == cols -1) { // if in bordering column or row
            cout << "*";   //output *
        } else {
            if (r == pad + 1 && c == pad + 1) { //if on row for greeting
                cout << greeting; // write greeting
                c += (greeting.size()-1); // adjust invariant
            } else {
                 cout << " ";
            }
        }
        ++c;
    }
    ++r;
    cout << std::endl;
}

return 0;
}

http://ideone.com/mb9InW

答案 3 :(得分:0)

除了重置外部循环中的变量c之外,您还没有在星号和消息之间进行填充。因此,在您打印消息的地方之后包括以下代码。

for(int i = 0;i<pad;i++)
{
    cout<<" ";
}