我正在通过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;
}
答案 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
不是循环的一部分,因为有一个分号。