将用户输入字符串调整为相等长度的行

Justifying user input string into lines of equal length

本文关键字:用户 输入 字符串 调整      更新时间:2023-10-16

所以,完全公开,我刚刚开始学习C++,这是作业的一部分。我不是在寻找答案,只是一些指导。

我想将一些字符串形式的文本调整为相等长度的行。文本和行长度都是用户输入的。

到目前为止,我得到的是下面的代码。做手头的任务很好。我向它抛出了一堆文本,它总是输出正确的格式。然而,我觉得我走错了路——代码感觉很笨拙,好像我在强迫它做一些它没有设计好做的事情(如果你知道我的意思的话)。

我应该寻找(或者有没有)一种更优雅的方式来做我想做的事情。我已经考虑过设置一个大小为[width][#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;
}

您当前的代码有一个错误:数组索引是基于0的,这意味着0length - 1是有效的,但length不是有效的索引。如果您的目标是在没有任何其他条件或约束的情况下将字符串拆分为固定大小的块,那么您可以考虑使用string::substr()。这将减少代码的数量,并使事情变得更清楚。

但我想知道固定大小的块是否真的是你的目标?当我听到"对齐"的文本时,我会想到已经换行(即在单词边界上拆分)的文本,然后插入空格,使每行的左右边缘对齐。示例:

The quick red fox jumped over the two lazy dogs.

使用14字符线宽对正:

快速的红色狐狸跳了起来超过两个懒惰的狗。

首先,据我所知,没有最佳实践。不过,我建议尽量简单。我使用了与您所做的类似的方法,但我在每个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;
}

如果将来有人在寻找类似问题的答案时偶然发现了这一点,我最终放弃了以前的代码,并使用SUBSTR(如@crbranch所建议的)将文本切碎,并将其输入到VECTOR中,如下所示:

#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;
}