Ex 1-17无限循环

时间:2015-03-29 08:46:02

标签: c

我正在通过K& K学习C语言R和我试图为Ex 1-17编写程序,它应该打印字符大于80的行。写入的代码适用于字符小于80的行,但对于大于80个字符的行,我的编译器会挂起运行时。 这是我输入的方式 - 我输入随机的80多个字符,最后按输入,我的编译器挂起我必须强制终止它。 我在Windows XP上使用 Turbo c ++ v4.5 我的问题是为什么我的编译器在按下回车后会挂起? 请帮我解决这个问题。

#include<stdio.h>
/* Program to print lines having length more than 80 chars */

#define MAX 80
#define MAXSIZE 1000

int getline( char a[], int b );
void copy ( char to[], char from[] );

main()
{
  int len1, len2;
  char line [ MAXSIZE ];
  char longest [ MAXSIZE ];

  len1 = len2 = 0;

  while( ( len1 = getline( line , MAXSIZE ) ) > 0 ) /* Check if there is a line */
     {
        if( len1 > MAX && len1 > len2 )
          {
             len2 = len1;
             copy( longest, line );
          }
     }

  if( len2 > MAX )
     printf("%s", longest);

  return 0;
}

int getline( char a[], int b )
{
  int i, c;

  for( i = 0; i < b - 1 && ( c = getchar() ) != EOF && c != '\n'; ++i )
        a [ i ] = c;
  if( c == '\n' )
     {                                                                                  /* In this section for loop is must the only way to insert \n and \0 in an array remember this method */
        a [ i ] = '\n' ;
        ++i;
     }

  a [ i ] = '\0';
  return i;
 }

void copy( char to[], char from[] )       /* For Copying a longest line */
 {
  int i = 0;
  while( ( to[ i ] = from [ i ] ) != '\0' );          
    ++i;
 }

2 个答案:

答案 0 :(得分:6)

你正在获得无限循环,因为你的函数void copy( char to[], char from[] )中有

  while( ( to[ i ] = from [ i ] ) != '\0' );          
    ++i;

在while循环后你留下了一个分号。删除它,这将停止无限循环。

由于分号,++i不是while循环的一部分,因此i的值永远不会增加。这是您的代码的问题。

另请注意,main()应为int main(void)int main(int argc, char *argv[]),因为这是标准。在TurboC ++上,您可能不需要指定main()的返回类型,但c标准明确指出main()必须返回一个类型。请参阅What should main() return in C and C++?

请注意,正如@timrau在评论中指出的那样,你将继续阅读输入,直到遇到EOF,为此,你必须按Ctrl + Z.否则,它将继续要求输入(你和& #39;仅当输入超过80个字符的字符串时才会输出。)

答案 1 :(得分:3)

copy函数中有一个无限循环:

while( ( to[ i ] = from [ i ] ) != '\0' );          
++i;

++i不是循环的一部分,因为有一个分号。