正如 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。