将用户输入字符串调整为相等长度的行
Justifying user input string into lines of equal length
所以,完全公开,我刚刚开始学习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的,这意味着0
到length - 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;
}
- C++如何通过用户输入删除列表元素
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 打印时有二叉树问题.用户输入不打印任何内容
- C ++奇怪的数组由用户输入
- 如何允许大写和小写用户输入?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用用户输入变量制作二维数组?
- 用户输入字符串的文件附加问题..C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?