我正在尝试解决 K&R C 的问题(练习 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("%s\n%d\n", 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] = '\0';
return i;
}
我的意图是摆脱:--i; //SPIKE
并将--i; //SPIKE
其替换为:
if (i < ttab)
{
++i;
}
但是为什么会导致挂起以及如何解决呢?