需要在 C 中自动换行
Need to word-wrap text in C
嗯,我有简单的作业。我从教师服务器收到文本,需要让它看起来像聊天。有些文字在左侧,有些在右侧。这就是我所做的和工作的。
i = 0;
ratac = 0;
int padding = 1;
while (recvbuf[i] != '[=10=]') {
if (ratac == 61) {
padding = 1;
ratac = 0;
}
if (padding) {
printf("%+60c", recvbuf[i]);
padding = 0;
}
else {
printf("%c", recvbuf[i]);
}
ratac++;
i++;
};
但我需要添加自动换行,但不知道该怎么做。 (一个词不能在两行上)。长这样就知道了
WORD WORD WORD WO
RD WORD WORD WORD
我需要让它看起来像这样
WORD WORD WORD
WORD WORD WORD
WORD
感谢您的帮助。
你必须知道完整单词的大小。
为此,请尝试更改您的代码以找到一个完整的单词(使用空格),然后确定它是否适合当前行或者您需要换行
写字当然要先确认是否有足够的地方
假设
- 分隔符只有空格
- 所有的分隔符都产生了(甚至是连续的或者在一行的开头)
- 如果一个词的长度超过宽度则不被切割(azeryuiop的情况在后面的执行中)
来自您的代码的建议,其中程序在参数中接收左边距、宽度和字符串
#include <stdio.h>
int length(char * p)
{
char * p2 = p;
while (*(++p2) && *p2 != ' ')
;
return (int)(p2 - p);
}
int main(int argc, char ** argv)
{
if (argc != 4) {
printf("Usage : %s <left margin> <width> <string>\n", *argv);
return -1;
}
int margin, width;
if ((sscanf(argv[1], "%d", &margin) != 1) || (margin < 0)) {
fprintf(stderr, "invalid margin\n");
return -1;
}
if ((sscanf(argv[2], "%d", &width) != 1) || (width < 1)) {
fprintf(stderr, "invalid width\n");
return -1;
}
char * recvbuf = argv[3];
int i = 0;
int ratac = width;
while (recvbuf[i] != '[=10=]') {
if (ratac >= width) {
if (i)
putchar('\n');
for (int j = 0; j != margin; ++j)
putchar(' ');
ratac = 0;
}
if (recvbuf[i] == ' ') {
putchar(' ');
i += 1;
ratac += 1;
}
else {
int len = length(recvbuf + i);
if (((ratac + len) <= width) || (ratac == 0)) {
ratac += len;
while (len--)
putchar(recvbuf[i++]);
}
else
ratac = width;
}
}
putchar('\n');
}
编译与执行:
pi@raspberrypi:~ $ gcc -pedantic -Wall -Wextra p.c
pi@raspberrypi:~ $ ./a.out 2 7 "a zer az e r az e aze azeryuiop aze"
a zer
az e r
az e
aze
azeryuiop
aze
pi@raspberrypi:~ $
嗯,我有简单的作业。我从教师服务器收到文本,需要让它看起来像聊天。有些文字在左侧,有些在右侧。这就是我所做的和工作的。
i = 0;
ratac = 0;
int padding = 1;
while (recvbuf[i] != '[=10=]') {
if (ratac == 61) {
padding = 1;
ratac = 0;
}
if (padding) {
printf("%+60c", recvbuf[i]);
padding = 0;
}
else {
printf("%c", recvbuf[i]);
}
ratac++;
i++;
};
但我需要添加自动换行,但不知道该怎么做。 (一个词不能在两行上)。长这样就知道了
WORD WORD WORD WO
RD WORD WORD WORD
我需要让它看起来像这样
WORD WORD WORD
WORD WORD WORD
WORD
感谢您的帮助。
你必须知道完整单词的大小。 为此,请尝试更改您的代码以找到一个完整的单词(使用空格),然后确定它是否适合当前行或者您需要换行
写字当然要先确认是否有足够的地方
假设
- 分隔符只有空格
- 所有的分隔符都产生了(甚至是连续的或者在一行的开头)
- 如果一个词的长度超过宽度则不被切割(azeryuiop的情况在后面的执行中)
来自您的代码的建议,其中程序在参数中接收左边距、宽度和字符串
#include <stdio.h>
int length(char * p)
{
char * p2 = p;
while (*(++p2) && *p2 != ' ')
;
return (int)(p2 - p);
}
int main(int argc, char ** argv)
{
if (argc != 4) {
printf("Usage : %s <left margin> <width> <string>\n", *argv);
return -1;
}
int margin, width;
if ((sscanf(argv[1], "%d", &margin) != 1) || (margin < 0)) {
fprintf(stderr, "invalid margin\n");
return -1;
}
if ((sscanf(argv[2], "%d", &width) != 1) || (width < 1)) {
fprintf(stderr, "invalid width\n");
return -1;
}
char * recvbuf = argv[3];
int i = 0;
int ratac = width;
while (recvbuf[i] != '[=10=]') {
if (ratac >= width) {
if (i)
putchar('\n');
for (int j = 0; j != margin; ++j)
putchar(' ');
ratac = 0;
}
if (recvbuf[i] == ' ') {
putchar(' ');
i += 1;
ratac += 1;
}
else {
int len = length(recvbuf + i);
if (((ratac + len) <= width) || (ratac == 0)) {
ratac += len;
while (len--)
putchar(recvbuf[i++]);
}
else
ratac = width;
}
}
putchar('\n');
}
编译与执行:
pi@raspberrypi:~ $ gcc -pedantic -Wall -Wextra p.c
pi@raspberrypi:~ $ ./a.out 2 7 "a zer az e r az e aze azeryuiop aze"
a zer
az e r
az e
aze
azeryuiop
aze
pi@raspberrypi:~ $