为什么my_getline()导致系统挂起?

时间:2015-10-27 20:10:56

标签: c arrays file

此程序尝试将文本文件的内容保存到字符变量数组中。然后应该使用my_getline()来打印字符数组的内容。我已经测试并看到内容实际上已保存到char *text但我无法弄清楚如何使用my_getline()打印char *text的内容。 my_getline是我们在课堂上编写的一个函数,我需要在这个程序中使用它。当我试图以教导的方式调用它时,它1被打印到终端,但终端只是等待而没有打印任何其他内容。任何指导将不胜感激。另外,如果我错过任何有用的信息,请告诉我。

/*   Include the standard input/output and string libraries             */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*   Define the maximum lines allowed in an input text and NEWLINE for getline funct.   */
#define MAXPATTERN 15
#define MAXFILENAMELENGTH 15
#define NEWLINE '\n'

/*   function prototypes                                */
void my_getline(char text[]);
int find_string(char text[], char pattern[], int length_text, int length_pattern);

int main()
{
   FILE *fp;
   long lSize;
   char *text;
   char fileName[MAXFILENAMELENGTH], pattern[MAXPATTERN];
   char c;
   int length_text, length_pattern, j, lineNumber = 1;

   printf("Enter file name: ");
   scanf("%s", fileName);

   fp = fopen(fileName, "r");
   if (fp == NULL)
   {
      printf("fopen failed.\n");
      return(-1);
   }

   fseek(fp, 0L, SEEK_END);
   lSize = ftell(fp);
   rewind(fp);

/*   allocate memory for all of text file                       */
   text = calloc(1, lSize + 2);
   if(!text)
   {
      fclose(fp);
      fputs("memory allocs fails", stderr);
      exit(1);
   }

/*   copy the file into text                                */
   if(1 != fread(text, lSize, 1, fp))
   {
      fclose(fp);
      free(text);
      fputs("Entire read fails", stderr);
      exit(1);
   }
   text[lSize + 1] = '\0';

   printf("%s has been copied.\n", fileName);

   rewind(fp);
   printf("%d  ", lineNumber);
   for (j = 0; (j = getchar()) != '\0'; j++)
   {
      my_getline(text);
      printf("%d %s\n", j+1, text);      
   }


   printf("Enter the pattern you would like to search for: ");
   scanf("%s", pattern);
   printf("\nYou have chosen to search for: %s\n", pattern);

   fclose(fp);
   free(text);
   return(0);
}

void my_getline(char text[])
{
   int i = 0;
   while ((text[i] = getchar()) != NEWLINE)
      ++i;
   text[i] = '\0';
}

2 个答案:

答案 0 :(得分:3)

很可能导致无限循环,因为您没有检查是否已达到EOF。

void my_getline(char text[])
{
   int i = 0;
   int c;
   while ( (c = getchar()) != NEWLINE && c != EOF )
      text[i++] = c;
   text[i] = '\0';
}

答案 1 :(得分:3)

您的函数导致系统挂起,因为您正在调用getchar(),它会返回标准输入中的下一个字符。这真的是你想要的吗?

此时,您的程序期待来自用户的输入。尝试在控制台窗口中键入并按下以查看它从“挂起”

返回