此程序的目的是读取文件并将其格式化为每行62个字符。这个程序编译并部分工作,大多数行是62个字符或更少,但有些行实际上是64个字符。
我想知道如何让所有线条打印出62个或更少的字符?
#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_DEPRECATE
void output(char *wbuf, char *lbuf);
void readFile(FILE *getty, char *wbuf, char *lbuf);
FILE *getty;
static int lineLength = 62;
int main(void) {
char wbuf[1000] = {0}, lbuf[1500] = {0};
if (fopen_s(&getty,"getty.txt", "r") != 0 )
printf("Failed to open getty.txt for reading.");
else {
readFile(getty, wbuf, lbuf);
}
fclose(getty);
return 0;
}
void readFile(FILE *getty, char *wbuf, char *lbuf) {
int count = 0;
while (!feof(getty) ) {
if (fscanf(getty, "%s", wbuf) > 0) {
strcat(wbuf," ");
output(wbuf, lbuf);
}
}
printf("%s\n",lbuf);
}
void output(char *wbuf, char *lbuf) {
int wbufLength=0, lbufLength, i = 0;
wbufLength = strlen(wbuf);
lbufLength = strlen(lbuf);
if ( (wbufLength + lbufLength) <= lineLength) {
strcat(lbuf,wbuf);
}
else {
strcat(lbuf,"\n");
lineLength += 62;
strcat(lbuf, wbuf);
}
}
输出: 四年前和七年前我们的父亲带来了58个字符 在这个大陆上,一个在自由中受孕的新国家 致力于人人生而平等的主张。现在// 64个字符 我们正在进行一场伟大的内战,测试是否存在 国家,或任何国家,如此构想,如此奉献,可以长久 忍受。我们在这场战争的伟大战场上相遇。 我们已经把它的一部分用作最后的休息 那些在这里为那个国家献出生命的人的地方 可能活着。我们应该完全合适和恰当 做这个。但从更广泛的意义上说,我们不能奉献 - 我们可以 没有奉献 - 我们不能使这个理由成为现实。勇敢的人, 在这里挣扎的生者和死者,已经将它奉献给了它 高于我们增加或减少的力量。世界将很少 注意,也不记得,我们在这里所说的,但永远不会 忘了他们在这里做了什么。这是为了我们,生活,而不是 因此,献身于他们所拥有的未完成的工作 远,如此高尚。我们宁愿来到这里 致力于摆在我们面前的伟大任务 尊敬的死者,我们更加热爱这一事业 他们在这里给出了最后一个充分的奉献精神 - 我们 在这里高度决心,这些死者不会死亡 虚荣;这个国家将重新诞生自由;和 这个人民的政府,由人民,为 人民,不应该从地球上灭亡。
答案 0 :(得分:0)
问题是当您添加 lineLength 变量时。
lineLength += 62;
通过向 lineLength 添加62,您假设在 lbuf 中已经使用了62个字符,但事实并非如此。你通常会用得更少,因为62个字符的单词数量通常最少少于62个字符。因此,所有后续计算都会稍微偏离。
您应该使用以下内容设置新的 lineLength 值:
lineLength = strlen(lbuf) + 62;
另请注意,这不是一个完美的算法,因为您在检查它是否合适之前在每个单词上添加一个空格。这意味着一个恰好适合62个字符限制的单词最终被包装,因为空格将其推到限制之上。我不知道这对你是否有问题。