<=的用法挂起程序,但是<效果良好(K&RC练习1-20)



我正试图从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
        }

相关内容

最新更新