C语言字符串的输入,排序和输出,程序异常,花了小弟我很长时间,哪位高手能帮小弟我调试下,找出异常原因

C语言字符串的输入,排序和输出,程序错误,花了我很长时间,谁能帮我调试下,找出错误原因。
          //C Primer Plus                                 

#include <stdio.h>
#include <string.h>
#define LIM 10
#define SIZE 81
void str_oriout (char *fstr[],int num);
void str_ascout (char *fstr[],int num); 
void str_lenout (char *fstr[],int num);
void str_wordout (char *fstr[],int num); 



int main (void)
{
char str[LIM][SIZE];                       //char 
    char * ptstr[LIM];                         
    char ch = 'N';
int i,j;
i = 0;
j = 0;
int is_EOF;

printf("Please enter 10 strings\n");
while (ch != 'Y')
{
while(i < LIM)                         //
    
     gets(str[i]);
    
    for(j = 0;j < strlen(str[i]);j++)  //
    {
      if (str[i][j] == EOF)        
         {
          is_EOF = 1;
          break;        //break  
         }
}

        ptstr[i] = str[i];  
    i++;  
    
    if (is_EOF == 1)
           break;   
           
        puts(str[i]);                      
puts(ptstr[i]);
    }
    
str_oriout(ptstr,i);
str_ascout(ptstr,i);
str_lenout(ptstr,i);
str_wordout(ptstr,i);

printf("Enter 'Y' to get out!\n");
ch = getchar();
getchar();

    }
    
return 0; 
 } 
 
void str_oriout (char *fstr[],int num)        //
{
int ct = 0;
for (ct = 0;ct < num;ct++)
puts(fstr[ct]);
}

void str_ascout (char *fstr[],int num)        //
{
char *temp;
int top,seek;
for (top = 0;top < num - 1;top++)
    for (seek = top + 1;seek < num;seek++)
        if (strcmp(fstr[top],fstr[seek]) > 0)
        {
         temp = fstr[seek];
         fstr[seek] = fstr[top];
         fstr[top] = temp;
}
for (top = 0;top < num;top++)
puts(fstr[top]);
}

void str_lenout (char *fstr[],int num)         
{
char *temp;
int top,seek;

for (top = 0; top < num-1; top++)
        for (seek = top + 1; seek < num; seek++)
             if (strlen(fstr[top]) < strlen(fstr[seek]))
                 {
                  temp = fstr[top];
                  fstr[top] = fstr[seek];
                  fstr[seek] = temp; 
 }  

for (top = 0;top < num;top++)
puts(fstr[top]);  
}

void str_wordout (char *fstr[],int num)          //
{
char *temp;
int top,seek;

for (top = 0; top < num-1; top++)
        for (seek = top + 1; seek < num; seek++)
            {
             int i,j;
             int count1,count2;
             i = j = 0;
count1 = count2 = 1;
            
             while (fstr[top][i] != '\0')
                       {count1++;
                        i++;}
                while (fstr[seek][j] != '\0')
       {count2++;
        j++;}
    if (count1 < count2)
   {
    temp = fstr[top];
    fstr[top] = fstr[seek];
    fstr[seek] = temp;     
   }         
}

    for (top = 0;top < num;top++)
 puts(fstr[top]);  


------解决思路----------------------
第二个while后面少了一个"{";导致程序有错,加个“{”吧。然后再调调看。
while(i < LIM)  后加"{".
------解决思路----------------------
修改如下:

//第11章第10题             //C Primer Plus                                 
//输入10个字符串,按不同要求排序输出 
#include <stdio.h>
#include <string.h>
#define LIM 10
#define SIZE 81
void str_oriout(char *fstr[], int num);
void str_ascout(char *fstr[], int num);
void str_lenout(char *fstr[], int num);
void str_wordout(char *fstr[], int num);
int main(void)
{
char str[LIM][SIZE];                //char *str[LIM] ,输入存在问题,一次只能输入一行 
char * ptstr[LIM];                  //注意声明!! 
char ch = 'N';
int i, j;
i = 0;
j = 0;
int is_EOF;
printf("Please enter 10 strings\n");
while (ch != 'Y')
{
while (i < LIM)             //输入10个字符串或遇到EOF结束 
{
gets(str[i]);

ptstr[i] = str[i];

for (j = 0; j < strlen(str[i]); j++)  //遇到EOF停止  
{
if (ptstr[i][j] == EOF)
{
is_EOF = 1;
break;        //break   
}
}
if (is_EOF == 1)
break;

puts(str[i]);
printf("******1\n");          //检查作用 
puts(ptstr[i]);
printf("******2\n");
i++;
}
str_oriout(ptstr, i);
str_ascout(ptstr, i);
str_lenout(ptstr, i);
str_wordout(ptstr, i);

printf("Enter 'Y' to get out!\n");
ch = getchar();
getchar();
}

return 0;
}
void str_oriout(char *fstr[], int num)        //输出初始字符串 
{
printf("******1\n");
int ct = 0;
for (ct = 0; ct < num; ct++)
puts(fstr[ct]);
}
void str_ascout(char *fstr[], int num)        //按首字母ASCII值的顺序输出字符串 
{
printf("******2\n");
char *temp;
int top, seek;
for (top = 0; top < num - 1; top++)
for (seek = top + 1; seek < num; seek++)
if (strcmp(fstr[top], fstr[seek]) > 0)
{
temp = fstr[seek];
fstr[seek] = fstr[top];
fstr[top] = temp;
}
for (top = 0; top < num; top++)
puts(fstr[top]);
}
void str_lenout(char *fstr[], int num)         //按数组长度排序 
{
printf("******3\n");
char *temp;
int top, seek;
for (top = 0; top < num - 1; top++)
for (seek = top + 1; seek < num; seek++)
if (strlen(fstr[top]) < strlen(fstr[seek]))
{
temp = fstr[top];
fstr[top] = fstr[seek];
fstr[seek] = temp;
}
for (top = 0; top < num; top++)
puts(fstr[top]);
}
void str_wordout(char *fstr[], int num)          //按第一个单词的长度排序 
{
printf("******4\n");
char *temp;
int top, seek;

for (top = 0; top < num - 1; top++)
for (seek = top + 1; seek < num; seek++)
{
int i, j;
int count1, count2;
i = j = 0;
count1 = count2 = 1;
while (fstr[top][i] != '\0')
{
count1++;
i++;
}
while (fstr[seek][j] != '\0')
{
count2++;
j++;
}
if (count1 < count2)
{
temp = fstr[top];
fstr[top] = fstr[seek];
fstr[seek] = temp;
}
}
for (top = 0; top < num; top++)
puts(fstr[top]);
}