我正在尝试解决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;
}但是为什么它会导致挂起,以及如何修复它呢?
发布于 2013-07-14 23:18:50
如果去掉++i和--i,那么当使用i==ttab时,您将永远循环,因为i再也不会改变了。
您可以先循环while i<ttab,然后在之后添加一个特殊的i==ttab检查,或者您可以使用一个for循环来递增i,然后在结束时执行i--。
发布于 2013-07-14 23:41:30
在你的代码中,当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
}https://stackoverflow.com/questions/17640656
复制相似问题