问题1. 到底是`size_t'还是`int'?
众所都周知,C标准库的许多IO函数都有一个对应的带“n”的版本,比如`strncpy()'之于`strcpy()'、`snprintf()'之于`sprintf()'等等。而这个多出来的“n”则是用于控制“最多只接受多少size的buffer”的。例如,strcpy的函数原型为:
char *strcpy(char *dest, const char *src);
而strncpy则为:
char *strncpy(char *dest, const char *src, size_t n);
最后的参数size_t n指的是要从src中复制的字符数。而类型为`size_t'的原因也很明显,它是sizeof运算符的返回类型,并且是platform-dependent,用来控制“字符的多少”也刚好合适。
然而,还有一些函数,比如`fgets()',它的函数原型却长这样:
char *fgets(char *str, int n, FILE *stream);
这里的“n”也指的是要读取的最大字符数。可它为何却不用从C89传承至今的`size_t',而要用int呢?
与之类似的函数还有`fread()'、`fwrite()'等。
众所都周知,C标准库的许多IO函数都有一个对应的带“n”的版本,比如`strncpy()'之于`strcpy()'、`snprintf()'之于`sprintf()'等等。而这个多出来的“n”则是用于控制“最多只接受多少size的buffer”的。例如,strcpy的函数原型为:
char *strcpy(char *dest, const char *src);
而strncpy则为:
char *strncpy(char *dest, const char *src, size_t n);
最后的参数size_t n指的是要从src中复制的字符数。而类型为`size_t'的原因也很明显,它是sizeof运算符的返回类型,并且是platform-dependent,用来控制“字符的多少”也刚好合适。
然而,还有一些函数,比如`fgets()',它的函数原型却长这样:
char *fgets(char *str, int n, FILE *stream);
这里的“n”也指的是要读取的最大字符数。可它为何却不用从C89传承至今的`size_t',而要用int呢?
与之类似的函数还有`fread()'、`fwrite()'等。