在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

10-08 08:53