在《C语言程序设计语言》第一章的结尾处,有一些练习需要完成。我现在正在做的一个练习要求你编写一个程序,将长字符串文本包装成多行,每行长度固定。下面的函数完美地实现了这个功能,除了最后一行无论指定行宽为多少都不会被包装成多行之外。
我发现问题出在变量
问题在于,在最后一行中,即使应该大于
// 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。问题在于,在最后一行中,即使应该大于
wrapline
,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,但实际上字符数明显多于此。
我不知道为什么会出现这种情况,有人能帮帮我吗?
(另外,我是 C 语言的完全初学者,对指针没有任何经验,请在回答中避免使用指针,谢谢)。
for(k = i - 1; k > 0; --k)
而不是for(k = i; k > 0; --k)
。 - ciphermagik - lastwrap <= wrapline
的用途。这个条件检查真的必要吗? - Kushagr Jaiswalif (wraploc == wrapline)
的情况也能正常工作,而不仅仅是if (wraploc >= wrapline)
。 - Kushagr Jaiswal