#define BUF_SIZE 260
char lineBuf[BUF_SIZE];
如果我们想通过fgets函数获得一行输入,下面:
1. fgets(lineBuf, BUF_SIZE - 1, stdin)
2. fgets(lineBuf, BUF_SIZE, stdin)
哪个才是正确的又充分利用了内存空间呢?
以前我总写作第一种形式, 看了《C和指针》(POINTERS ON C)后才知道,其实第二种方法才是更好的。
测试代码;
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 10
void disp(char *pBuf, size_t len)
{
size_t i;
for (i = 0; i < len; ++i) {
printf("%d ", pBuf[i]);
}
puts("");
}
void flushinp(void)
{
int ch;
while ( (ch = getchar()) != EOF && ch != '\n' );
}
int main(void)
{
char lineBuf[BUF_SIZE];
char lineBuf_2[BUF_SIZE];
size_t len = 0;
fgets(lineBuf, BUF_SIZE, stdin);
len = strlen(lineBuf);
if (lineBuf[len - 1] == '\n') {
ungetc(lineBuf[len - 1], stdin); /* 这里把换行符“丢弃” */
}
flushinp();
fgets(lineBuf_2, BUF_SIZE - 1, stdin);
disp(lineBuf, BUF_SIZE);
disp(lineBuf_2, BUF_SIZE);
return 0;
}
测试数据:(VC++6.0)
012
012
48 49 50 10 0 -52 -52 -52 -52 -52
48 49 50 10 0 -52 -52 -52 -52 -52
Press any key to continue
0123456789
0123456789
48 49 50 51 52 53 54 55 56 0
48 49 50 51 52 53 54 55 0 -52
Press any key to continue
因为第二个参数为BUF_SIZE时,fgets函数也保证会自动为字符串末尾加一个\0。
接着这个问题讨论
#define __STR(const_num) # const_num
#define STR(const_num) __STR(const_num)
#define BUF_SIZE 10
#define BUF_SIZE_MINUS_ONE 9 /* BUF_SIZE - 1 */
char lineBuf[BUF_SIZE];
下面调用scanf函数:
1. scanf("%"STR(BUF_SIZE _MINUS_ONE)"s", lineBuf);
2. scanf("%"STR(BUF_SIZE)"s", lineBuf);
测试代码:
#include <stdio.h>
#define BUF_SIZE 10
#define BUF_SIZE_MINUS_ONE 9 /* BUF_SIZE - 1 */
#define __STR(cn) # cn
#define STR(cn) __STR(cn)
void disp(char *pBuf, size_t len)
{
size_t i;
for (i = 0; i < len; ++i) {
printf("%d ", pBuf[i]);
}
puts("");
}
void flushinp(void)
{
int ch;
while ( (ch = getchar()) != EOF && ch != '\n' );
}
int main(void)
{
char lineBuf[BUF_SIZE];
char lineBuf_2[BUF_SIZE];
scanf("%"STR(BUF_SIZE)"s", lineBuf);
flushinp();
scanf("%"STR(BUF_SIZE_MINUS_ONE)"s", lineBuf_2);
disp(lineBuf, BUF_SIZE);
disp(lineBuf_2, BUF_SIZE);
return 0;
}
测试数据:(VC++6.0)
0123456789
0123456789
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 0
Press any key to continue
可见,对于scanf函数scanf("%"STR(BUF_SIZE _MINUS_ONE)"s", lineBuf)才对。