在C中编写一个简单的Unix wc工具实现时,我想知道是否有一些方法可以编写我的函数来在while循环条件中选择getchar()
或getc()
而不复制粘贴整个循环或编写一个新的,几乎相同的函数。
基本上我想通过使函数更灵活来避免代码重复,以便它可以从文件或stdin
读取。谢谢!
void count (char *file) {
FILE *fp = fopen(file, "r");
int c;
bool in_word = false;
while((c = getc(fp)) != EOF) { //want to easily swap getc() with getchar() here
char_count++;
if (c == '\n') {
line_count++;
}
if ((c == ' ') || (c == '\t') || (c == '\n')) {
in_word = false;
}
else if (in_word == false) {
in_word = true;
word_count++;
}
}
fclose(fp);
}
答案 0 :(得分:1)
你想在什么条件下交换bewt之间的getc()和getchar()?
如果在编译时知道它,您可以像这样使用预处理器宏
#define USE_GET_C TRUE
#if (USE_GET_C == TRUE)
while((c = getc(fp)) != EOF) { //want to easily swap getc() with getchar() here
#else
while((c = getchar()) != EOF) {
#endif
.. remaining code below
但是,如果条件仅在运行时已知,则需要一个包装函数,该函数将使用一个参数来告诉您是使用getc还是getchar。
像这样。
int wrapper(bool use_getc, FILE* fp);
wrapper(bool use_getc, FILE* fp)
{
if (use_getc == TRUE)
return(getc(fp);
else
return(getchar());
}