1

我想定义一个宏来指示记录文本的最大大小。像这样:

#define RECORD_TEXT_MAX_SIZE 255 /*the max size of the text which get from one record*/

然后像这样使用:

char text[RECORD_TEXT_MAX_SIZE+1];

用户必须定义​​数组大小“RECORD_TEXT_MAX_SIZE+1”以包含空字符。

但我想我可以这样定义

 #define RECORD_TEXT_MAX_SIZE 256 /*the max size of the text which get from one record*/

然后像这样使用:

char text[RECORD_TEXT_MAX_SIZE];

我无法决定使用哪个。

你能给我一个建议吗?

通用规格是什么?

4

2 回答 2

3

这确实是一个偏好问题,但我的意见是:

#define RECORD_TEXT_MAX_SIZE   255

char text[RECORD_TEXT_MAX_SIZE + 1];

原因是它仍然指示缓冲区中可以有RECORD_TEXT_MAX_SIZE多少实际字符,同时始终为空终止符留出空间。

问题或与之相反的论点是,大多数strn...函数(采用长度参数)在限制要写入的字节数时都包含空终止符。

于 2013-06-25T03:32:20.180 回答
-2

正如 Jonathan Reinhart 所指出的,这确实是一个偏好问题,他建议这样做:

#define RECORD_TEXT_MAX_SIZE   255

char text[RECORD_TEXT_MAX_SIZE + 1];

这当然是一个非常好的习惯,从我的例子中会更清楚。

然而,这取决于编译器来决定。当它到达文本的末尾时,编译器会自动附加空字符,即不需要为此烦恼。无论你放在数组的“[]”中什么都会变成大小以我为此目的编写的程序为例:

#include<stdio.h>
#define text_max 10
int main()
{
  char txt[text_max+1];
  printf("please enter the text :\n");
  fgets(txt,sizeof txt,stdin);
  for(int i=0;txt[i]!='\0';i++)
  printf("%c",txt[i]);
  return 0;
}

这个程序输入一个字符序列,编译器会在十个字符后自动附加一个'\0',但是通过像这样声明数组大小增加一个空格不会让阅读程序的人甚至你自己混淆最后一个字符去了。你总是知道你必须输入text_max字符。

输入:helloworldhi

OUTPUT:helloworld //这里“hi”被截断,“d”后面输入“\0”,你不需要考虑最后一个字符,因为你将数组大小声明为 text_max+1。

为了消除我的疑虑,我编写了另一个这样的程序:

#include<stdio.h>
#define text_max 10
int main()
{
  char txt[text_max];
  printf("please enter the text :\n");
   fgets(txt,sizeof txt,stdin);
 for(int i=0;txt[i]!='\0';i++)
  printf("%c",txt[i]);
  return 0;
}

然而,这个程序打印出 9 个字符,截断一些额外的字符以适应 NULL 终止符:

输入:helloworldhi

OUTPUT:helloworl //这里“dhi”被截断,编译器在 9 个字符后输入 '\0'。

这意味着无论您声明什么,编译器都会在文本末尾为 '\0' 字符腾出空间,但正如您所见,这样声明是一个更好的习惯:

 #define RECORD_TEXT_MAX_SIZE   255

    char text[RECORD_TEXT_MAX_SIZE + 1];

注意:编译器是 Windows 上的 gcc。

于 2013-06-25T04:53:01.407 回答