首页 > 解决方案 > 读取多行直到 EOF

问题描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

//the function
char* scan(char *string)
{
  int c; //as getchar() returns `int`
  string = malloc(sizeof(char)); //allocating memory

  string[0]='\0';

  for(int i=0; i<100 && (c=getchar())!='\n' && c != EOF ; i++)
  {
    string = realloc(string, (i+2)*sizeof(char)); //reallocating memory
    string[i] = (char) c; //type casting `int` to `char`
    string[i+1] = '\0'; //inserting null character at the end
  }

  return string;
}
char** bigScan(char **string)
{

  int c;
  string=malloc(sizeof(char *));
  string[0]='\0';
  for(int i=0;(c=getchar()!=EOF);i++)
  {
    *string = realloc(string, (i+2)*sizeof(char *)); //reallocating memory
    string[i] = scan(string[i]); //type casting `int` to `char`
    string[i+1] = '\0'; //inserting null character at the end

  }
  return string;

}
int main(void)
{
  char **buf; //pointer to hold base address of string
  buf=bigScan(buf);
  printf("%s\n",buf[0] );


}

所以基本上扫描函数读取每一行直到EOF或新行。bigScan的工作是通过调用扫描函数读取多行(指向字符串的指针),直到我们到达EOF。所以本质上,大扫描返回指向指针的指针,我们可以使用它读取整个文本。我的方法做错了什么?基本上在我的 bigScan 中调用扫描功能,直到我点击 EOF。

  Ideal Input:
  "Hi guys and girls
  This is a message in multiple lines."
  Ideal Output:
  "Hi guys and girls
  This is a message in multiple lines."

标签: cmallocstdoutstdin

解决方案


  1. 内部无效(c=getchar()!=EOF)bigScan它将1or的值分配0给 c,因为该bool值是!=比较的结果。
  2. 内部将使您每行松散一个字符,因为该字符无处保存getchar()bigScan
  3. 分配bigScan无效。您不应该为 string 分配内存*string = realloc(string,但应该为指针本身分配内存,即。string = realloc(string, ... sizeof(char*)).
  4. NULL是用于指针的终止值。不要'\0'用于指针。
  5. 用于size_t存储尺寸。
  6. 如果要覆盖参数值,则传递参数值毫无意义。在此函数中,变量a未使用void f(int a) { a = 1; },因为两个函数中的变量string在进入函数后立即分配。
  7. 该函数对字符scan有硬性限制。i<100

以下是您的功能的一些固定版本。还重命名了变量。并删除了参数。和不同的缩进。并用assert来自标准的离子#include <assert.h>作为原始错误检查。这样ungetc读入的字符bigScan就不会消失。而且我还没有运行这段代码,所以它有很多错误。

char* scan(void)
{
  char *string = malloc(sizeof(*string));
  assert(string != NULL);
  string[0] = '\0';
  size_t stringlen = 1;

  for(int c; (c=getchar()) != '\n' && c != EOF;) {
    void * const ptr = realloc(string, (stringlen + 1) * sizeof(*string));
    assert(ptr != NULL);
    stringlen++;
    string[stringlen - 2] = c;
    string[stringlen - 1] = '\0'; //inserting null character at the end
  }

  return string;
}


char** bigScan(void)
{
  char **strings = malloc(sizeof(*strings));
  assert(strings != NULL);
  strings[0] = NULL;
  size_t stringslen = 1;

  for(int c; (c = getchar()) != EOF;) {
    ungetc(c);

    void * const ptr = realloc(strings, (stringslen + 1) * sizeof(*strings)); 
    assert(ptr != NULL);
    strings = ptr;
    stringslen++;
    strings[stringslen - 2] = scan();
    strings[stringslen - 1] = NULL;

  }

  return strings;
}

推荐阅读