C 为什么我的_getline()会导致系统挂起?

C 为什么我的_getline()会导致系统挂起?,c,arrays,file,C,Arrays,File,此程序尝试将文本文件的内容保存到字符变量数组中。然后应该使用my_getline()打印字符数组的内容。我已经测试并看到内容实际上被保存到char*text中,但我不知道如何使用my_getline()打印char*text的内容。my_getline是我们在类中编写的函数,我需要在这个程序中使用它。当我尝试以设定的方式调用它时,它1被打印到终端,但终端只是等待,没有打印其他内容。任何指导都将不胜感激。另外,如果我遗漏了任何有帮助的信息,请告诉我 /* Include the standar

此程序尝试将文本文件的内容保存到字符变量数组中。然后应该使用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';
}
/*包括标准输入/输出和字符串库*/
#包括
#包括
#包括
/*为getline funct定义输入文本和换行符中允许的最大行数*/
#定义MAXPATTERN 15
#定义MAXFILENAMELENGTH 15
#定义换行符“\n”
/*功能原型*/
作废我的获取行(字符文本[]);
int find_字符串(字符文本[],字符模式[],int length_文本,int length_模式);
int main()
{
文件*fp;
长时间lSize;
字符*文本;
字符文件名[MAXFILENAMELENGTH],模式[MAXPATTERN];
字符c;
int length_text,length_pattern,j,lineNumber=1;
printf(“输入文件名:”);
scanf(“%s”,文件名);
fp=fopen(文件名,“r”);
如果(fp==NULL)
{
printf(“fopen失败。\n”);
返回(-1);
}
fseek(fp,0L,SEEK_END);
lSize=ftell(fp);
倒带(fp);
/*为所有文本文件分配内存*/
text=calloc(1,lSize+2);
如果(!text)
{
fclose(fp);
fputs(“内存分配失败”,标准);
出口(1);
}
/*将文件复制到文本中*/
如果(1!=fread(文本,lSize,1,fp))
{
fclose(fp);
免费(文本);
fputs(“整个读取失败”,stderr);
出口(1);
}
文本[lSize+1]='\0';
printf(“%s已被复制。\n”,文件名);
倒带(fp);
printf(“%d”,行号);
对于(j=0;(j=getchar())!='\0';j++)
{
my_getline(文本);
printf(“%d%s\n”,j+1,文本);
}
printf(“输入要搜索的图案:”);
扫描频率(“%s”,模式);
printf(“\n您已选择搜索:%s\n”,模式);
fclose(fp);
免费(文本);
返回(0);
}
void my_getline(字符文本[])
{
int i=0;
while((text[i]=getchar())!=NEWLINE)
++一,;
文本[i]='\0';
}

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

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

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

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

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


此时,您的程序需要用户的输入。尝试在控制台窗口中键入,然后按查看它从“挂起”返回。

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


此时,您的程序需要用户的输入。尝试在控制台窗口中键入,然后按查看它从“挂起”状态返回。

我将代码更改为与您的代码相似,但问题没有解决。我现在意识到它不是一个无限循环,而是打印1,系统就在那里等待。你说8使用
my_getline()
*打印
char*text
的内容,这有点误导。名称为“get”,您希望它“print”。请澄清您的意图。我的意图是通过调用My_getline()一次打印一行char*text的内容。我们必须在程序中使用my_getline(),但我不明白如果它甚至不返回任何内容,它如何一次打印一行。我对它的用法感到困惑。@PatMulvihill,从你的指导老师那里得到一些关于该函数用途的说明会很有用。我更改了我的代码,使之与你的代码相似,但问题没有解决。我现在意识到它不是一个无限循环,而是打印1,系统就在那里等待。你说8使用
my_getline()
*打印
char*text
的内容,这有点误导。名称为“get”,您希望它“print”。请澄清您的意图。我的意图是通过调用My_getline()一次打印一行char*text的内容。我们必须在程序中使用my_getline(),但我不明白如果它甚至不返回任何内容,它如何一次打印一行。我对它的用法感到困惑。@PatMulvihill,从您的讲师那里了解该函数的用途将非常有用。您已经将该文件的内容复制到了
text
。当您调用
my_getline
时,是否打算用来自
stdin
的数据覆盖它?使用
getchar
似乎是错误的。说实话,我的整个getline函数让我感到困惑。据我所知,它一次打印一行
*text
中包含的文本,但我看到它没有返回任何内容,因此我不确定它到底在做什么。我们的教授在课堂上和我们一起写的,我们被告知必须在这项作业中使用它。你能给我解释一下它是怎么回事以及为什么不是最佳的吗?你已经把文件的内容复制到
文本中了。当您调用
my_getline
时,是否打算用来自
stdin
的数据覆盖它?使用
getchar
似乎是错误的。说实话,我的整个getline函数让我感到困惑。据我所知,它打印了
*text
one l中包含的文本