在C中的while循环条件内,在getc()和getchar()之间切换

时间:2015-08-31 08:17:20

标签: c count word

在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);
}

1 个答案:

答案 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());
}