【问题标题】:C - Display a string of character with a low MacrosC - 使用低宏显示字符串
【发布时间】:2013-11-22 21:35:55
【问题描述】:

我需要你解决一个小问题。 我尝试读取一个文件并根据我的宏的值显示他的内容(如函数“cat”)。 使用我的 BUFF_SIZE 4096 我可以轻松地显示字符串,但是当我输入 BUFF_SIZE 1 时,我的程序会显示所有行的第一个字符。 我不确定我的代码是否 100%,因为我在我的个人电脑上,但如果你真的需要它,我明天可以给你。 对于我的问题,我认为我必须做一些类似函数 strdup 的事情,但我真的不知道如何将它包含在我的代码中

#define BUFF_SIZE 4096

char     *my_function(const int a)
{
 static int i;
 static char **str;
 static int ret;
 static char *buff[BUFF_SIZE];
 static int j;

 i = 0;
 j = 0;
 str = malloc(BUFF_SIZE * sizeof(char));
 while ((ret =read(a, buff, BUFF_SIZE)) > 0)
  {
    while (buff[i] != '\0')
      {
        str[j] = buff[i];
        i++;
        j++;
      }
    return (str);
  }
free(str);
}

对不起,我的英文大概是

【问题讨论】:

  • (a, buff, BUFF_SIZE) 会返回一个int?怎么样?
  • str = malloc(BUFF_SIZE * sizeof(char)); 没有分配足够的内存;使用str = malloc(BUFF_SIZE * sizeof str[0]);
  • 我忘了更改读取,我已经编辑了我的消息,它是 ret = read(a,buff,BUFF_SIZE)
  • And.... ufff... 这段代码有一些非常错误的地方:为什么在内部循环中返回?有了它,您只会读取一次文件。然后,退出函数。
  • read() 系统调用不会终止输入数据。您的循环需要循环读取已读取的字符数。但是您也需要丢失所有这些静态变量,并弄清楚该函数的真正目的是什么(因为它肯定没有达到预期的效果——它充其量是可怕的泄漏)。如果您想将整个文件 slurp 到内存中(“slurp”是读取整个文件的技术术语)。您通常会找到文件的大小(例如lseek()),分配内存并读取。或者您以 64 KiB 的块为单位增量分配内存。等等。

标签: c string macros


【解决方案1】:

static char *buff[BUFF_SIZE];

您已将 buff 声明为指向 char 的指针数组。同时你使用它的方式表明你真正的意思是

static char buff[BUFF_SIZE];

如果您多次调用它,您的函数也会出现严重问题。 例如,ij 在下一次调用 my_function() 时可能不会为零。 “静态”表示程序启动时变量将被初始化为零。它不会在函数入口处将初始化变量归零。

【讨论】:

  • 而str应该定义为char *str,而不是char **str
  • 确实如此。 gcc -Wall -Werror 应该是默认编译器设置。 :-)
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多