将用户输入字符串校正为相等长度的行

时间:2015-11-21 01:16:26

标签: c++

所以,完全披露,我刚刚开始学习C ++,这是一项任务的一部分。我不是在寻找答案,只是一些指导。

我希望将一些字符串形式的文本证明为等长的行。文本和行长都是用户输入的。

我到目前为止的代码是下面的代码。它可以很好地完成手头的任务。我在它上面扔了一堆文字,它总是为它输出正确的格式。然而,我感觉好像我走错了方向 - 代码感觉很笨,好像我强迫它去做一些它没有被设计的东西(如果你知道我的意思)

我应该寻找(或者是否有)更优雅的方式去做我想做的事情。我考虑过设置一个大小为[宽度] [#lines]的2D数组,这样我就可以逐行输出。这会是一种更好的做事方式吗?是否有某种"最佳实践"谈到这个东西?

#include <iostream>
#include <string>

using namespace std;

int main()
{

string randtext;
string output;
int width;

// User input text string.
cout << "Enter a Random String of Text: " << endl;
getline(cin, randtext);
// User input line width.
cout << "Enter justification Width" << endl;
cin >> width;

int length = randtext.length();

int i = 0;
// This bit parses through the string.
while (i <= length)
{
    // This bit creates lines of length = width.
    for (int j = 0; j < width; ++j)
    {
        if (i + j > length) { break; }
        char letter = randtext[i+j];
        output += letter;
    }

    // This bit outputs the lines and then clears everything.
    cout << output << endl;
    output.clear();
    i += width;

}

cin.get();
cin.get();

return 0;
}

3 个答案:

答案 0 :(得分:0)

您当前的代码有一个错误:数组索引从0开始,意味着projection0有效,但length - 1不是有效索引。如果您的目标是将字符串拆分为固定大小的块而没有任何其他条件或约束,则可以考虑使用length。这样可以减少代码量,并使事情更加清晰。

但是我想知道固定大小的块是否真的是你的目标?当我听到&#34;合理的&#34;文本,我想到已被自动换行的文本(即,在单词边界上拆分)然后插入空格,以便每行的左右边缘对齐。例如:

string::substr()

使用14个字符的线宽进行对齐:

The quick  red
fox     jumped
over  the  two
lazy dogs.

答案 1 :(得分:0)

首先据我所知,没有最佳做法。但是,我建议尽量保持简单。我已经使用了与你所做的相似的方法,但是我已经每隔width间隔向randtext字符串插入一个新的行字符然后打印出来。这大大减少了代码大小并提高了可读性。我已根据您的代码对此进行了测试,输出完全相同。代码如下所示。

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
    using namespace std;
    string randtext;
    int width;

    // User input text string.
    cout << "Enter a Random String of Text: " << endl;
    getline(cin, randtext);
    // User input line width.
    cout << "Enter justification Width" << endl;
    cin >> width;

    // Insert a newline character every nth character given that n = width
    for (size_t i = 0; i < randtext.length(); i+=width+1)
    {
        randtext.insert(i,"\n");
    }
    cout << randtext << endl;

    cin.get();
    cin.get();
    return 0;
}

答案 2 :(得分:0)

如果有人在将来偶然发现这个类似问题的答案,我最终会废弃我之前的代码并使用SUBSTR(如@cbranch所建议的那样)来切断文本并将其输入到矢量中如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{

string input = "The quick brown fox, jumps over the. Lazy dog. There is, no cow. LEVEL";
int width = 20;
int length = input.size();
int j = 0;

vector<string> input_vector (0);

// For loop that chops up the input using input.substr() and feeds it into a vector that re-sizes as needed.
for (int i = 0; i < length; i+=width)
{
    // Dynamic vector resizing as needed.
    input_vector.resize(j + 1);

    string input_sub = input.substr(i, width);

    input_vector[j] = input_sub;
    j++;

}

int size_vector = input_vector.size();

// For loop that outputs the chopped out lines as elements of the vector.
for (int k = 0; k < size_vector; ++k)
{
    cout << input_vector[k] << endl;
}

return 0;
}