我想定义一个宏来指示记录文本的最大大小。 像这样:
#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];
我无法决定使用哪个。
你能给我一个建议吗?
哪个是一般规格?
答案 0 :(得分:3)
这确实是一个偏好问题,但我的意见是:
#define RECORD_TEXT_MAX_SIZE 255
char text[RECORD_TEXT_MAX_SIZE + 1];
原因是RECORD_TEXT_MAX_SIZE
仍然表示缓冲区中可以包含多少实际字符,同时始终为空终止符留出空间。
问题或反驳的是,当限制要写入的字节数时,大多数strn...
函数(采用长度参数)包括空终止符。
答案 1 :(得分:-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
个字符。
INPUT:helloworldhi
OUTPUT:helloworld //这里“hi”被截断,“\ 0”在“d”之后输入,你不需要考虑最后一个字符,因为你声明数组大小为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终止符:
INPUT:helloworldhi
OUTPUT:helloworl //这里“dhi”被截断,编译器在9个字符后输入'\ 0'。
这意味着无论你声明什么,编译器总是会在文本末尾为'\ 0'字符留出空间,但正如你可以看到它更好的习惯,如下所示:
#define RECORD_TEXT_MAX_SIZE 255
char text[RECORD_TEXT_MAX_SIZE + 1];
注意:编译器是Windows上的gcc。