在C编程语言第一章的末尾,有一些练习要完成。我现在要做的是让你做一个程序,把一长串的文本以特定的长度包装成多行。下面的函数工作100%,除了最后一行没有被包装,不管指定的最大线宽。
// wrap: take a long input line and wrap it into multiple lines
void wrap(char s[], const int wrapline)
{
int i, k, wraploc, lastwrap;
lastwrap = 0; // saves character index after most recent line wrap
wraploc = 0; // used to find the location for next word wrap
for (i = 0; s[i] != '\0'; ++i, ++wraploc) {
if (wraploc >= wrapline) {
for (k = i; k > 0; --k) {
// make sure word wrap doesn't overflow past maximum length
if (k - lastwrap <= wrapline && s[k] == ' ') {
s[k] = '\n';
lastwrap = k+1;
break;
}
}
wraploc = 0;
}
} // end main loop
for (i = 0; i < wrapline; ++i) printf(" ");
printf("|\n");
printf("%s\n", s);
}
我发现这个问题与变量
wraploc
增加,直到它大于wrapline
(一行的最大索引)。一旦大于wrapline
,就在适当的位置插入新行,并将wraploc
重置为0。问题是,在最后一行,
wraploc
永远不会大于wrapline
,即使它应该大于。它会在字符串的整个迭代过程中完全递增,直到最后一行。举个例子:char s[] = "This is a sample string the last line will surely overflow";
wrap(s, 15);
$ ./a.out
|
this is a
sample string
the last line
will surely overflow
该行表示应该包装它的位置。在这种情况下,
wraploc
的值为14,而字符数明显多于14。我不知道为什么会这样,有人能帮我吗?
(另外,我是C语言的初学者,我对指针没有任何经验,所以请远离答案中的指针,谢谢)。
最佳答案
您用wraploc
递增i
,直到它达到wrapline
(示例中为15)。
包装时,从i
返回到最后一个空白。
这意味着在下一行中,您已经在lastwrap
位置和i
之间有了一些字符,也就是说,您不能在那里将wraploc
重置为0。
改为尝试设置wraploc = i-lastwrap
。