首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用<=会挂起程序,但<工作正常(K&R C练习1-20)

问使用<=会挂起程序,但<工作正常(K&R C练习1-20)
EN

Stack Overflow用户
提问于 2013-07-14 23:13:02
回答 2查看 160关注 0票数 0

我正在尝试解决K&R C中的问题(练习1-20)。我已经将原始的getline函数转换成了int detab(char s[], int lim, int tab)。函数的以下部分出现问题:

代码语言:javascript
复制
       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的注释并将其注释掉:

代码语言:javascript
复制
            if (i < ttab)
            {
                ++i;
            }

然后,我对程序行为感到满意,但对代码外观不满意。

代码语言:javascript
复制
#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,代之以:

代码语言:javascript
复制
            if (i < ttab)
            {
                ++i;
            }

但是为什么它会导致挂起,以及如何修复它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-14 23:18:50

如果去掉++i和--i,那么当使用i==ttab时,您将永远循环,因为i再也不会改变了。

您可以先循环while i<ttab,然后在之后添加一个特殊的i==ttab检查,或者您可以使用一个for循环来递增i,然后在结束时执行i--。

票数 3
EN

Stack Overflow用户

发布于 2013-07-14 23:41:30

在你的代码中,当i值与ttab相同时,下面的代码会变成一个无限循环。

代码语言:javascript
复制
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
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17640656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档