gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:48 26 4
gpt4 key购买 nike

我正在尝试解决 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;
}

但为什么会导致挂起以及如何解决?

最佳答案

如果您选择 ++i--i出来,然后当i==ttab ,你永远循环,因为i永远不会再改变。
你可以循环 while i<ttab然后为 i==ttab 添加一个特殊检查之后,或者您可以使用递增 i 的 for 循环, 然后做 i--在最后。

关于c - 使用 <= 会挂起程序,但 < 可以正常工作(K&R C 练习 1-20),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17640656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com