C-阅读多行直至EOF

  • 本文关键字:EOF c malloc stdout stdin
  • 更新时间 :
  • 英文 :

#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]='';
  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] = ''; //inserting null character at the end
  }
  return string;
}
char** bigScan(char **string)
{
  int c;
  string=malloc(sizeof(char *));
  string[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] = ''; //inserting null character at the end
  }
  return string;
}
int main(void)
{
  char **buf; //pointer to hold base address of string
  buf=bigScan(buf);
  printf("%sn",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."
  1. bigScan内部的(c=getchar()!=EOF)无效。它将10的值分配给C,因为bool值是!=比较的结果。
  2. bigScan内部的getchar()将使您每行松动一个字符,因为该字符无处可保存。
  3. bigScan中的分配无效。您不应该为字符串*string = realloc(string分配内存,但是您应该为指针本身分配内存。string = realloc(string, ... sizeof(char*))
  4. NULL是用于指针的终止值。不要将''用于指针。
  5. 使用size_t存储尺寸。
  6. 如果您要覆盖参数,传递参数值几乎没有意义。在此函数中,变量a是未使用的void f(int a) { a = 1; },因为输入功能后,您的两个功能中的变量string都会立即分配。
  7. 函数scan具有i<100字符的硬限。

以下是您功能的固定版本。还更名为变量。并删除参数。和不同的凹痕。并使用来自标准#include <assert.h>assert离子用作原始错误检查。并且使用ungetc,因此bigScan中读取的字符不会消失。而且我没有运行此代码,所以它有很多错误。

char* scan(void)
{
  char *string = malloc(sizeof(*string));
  assert(string != NULL);
  string[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] = ''; //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;
}

相关内容

  • 没有找到相关文章

最新更新