我正试图从K&RC(练习1-20)。我已经将原来的getline
函数转换为int detab(char s[], int lim, int tab)
。以下功能部分出现问题:
while (i <= ttab)
{
s[i] = ' ';
if (i < ttab)
{
++i;
}
//++i; //SPIKE
}
//--i; //SPIKE
若我按照上面写的方式运行它,程序就会挂起,什么也不做。如果我将if (i < ttab)
更改为if (i <= ttab)
,程序将按照我的预期运行(i
将比需要高1)。如果我取消注释--i; //SPIKE
和--i; //SPIKE
并注释掉:
if (i < ttab)
{
++i;
}
然后,我对程序行为很满意,但对代码外观不满意。
#include <stdio.h>
#define MAXLINE 1000 // maximum input line size
#define TAB 5 // assumed tab length
int detab(char line[], int maxline, int TabStop);
//prints one line at a time; replaces tabs with TAB spaces
main()
{
int len; //current line length
char line[MAXLINE]; //current input line
while ((len = detab(line, MAXLINE, TAB)) > 0)
{
printf("%sn%dn", line, len);
}
return 0;
}
// getline: read a line into s, return length, replaces each tab in the s by tablen spaces
int detab(char s[], int lim, int tab)
{
int c, i;
int ttab = tab;
for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='n'; ++i)
{
if (c == 't')
{
while (ttab < i)
{
ttab += tab;
}
while (i <= ttab)
{
s[i] = ' ';
if (i < ttab)
{
++i;
}
//++i; //SPIKE
}
//--i; //SPIKE
}
else
{
s[i] = c;
}
}
if (c == 'n')
{
s[i] = c;
++i;
}
s[i] = ' ';
return i;
}
我的意图是去掉:--i; //SPIKE
和--i; //SPIKE
,代之以:
if (i < ttab)
{
++i;
}
但为什么它会导致上吊?如何解决?
如果去掉++i
和--i
,那么当i==ttab
时,将永远循环,因为i
再也不会改变
您可以循环i<ttab
,然后在i==ttab
之后添加一个特殊的检查,或者您可以使用一个递增i
的for循环,然后在末尾执行i--
。
在您的代码中,当i值与ttab相同时,下面的代码将变成一个无限循环。
while (i <= ttab) //if i== ttab it will come to loop body
{
s[i] = ' ';
if (i < ttab) //if i == ttab then i never going to increment
{
++i;
}
//++i; //SPIKE
}