while(getchar!='\ n');替代清除缓冲区

时间:2019-12-07 14:08:28

标签: c input

我读到getchar()返回它读取的字符,因此我想知道这是否可以替代while (getchar() != '\n');来清除缓冲区。我还没有看到任何类似的代码使用这种技术来清除缓冲区。

#include <stdio.h>

char clearBuffer(void) {
    char cChar;
    scanf("%c", &cChar);
    return cChar;
}

int main() {
    int n;
    do {
        printf("Enter N: ");
        scanf("%d", &n);
        while (clearBuffer() != '\n');
        printf("N is %d\n", n);
    } while (n != 0);
}

2 个答案:

答案 0 :(得分:2)

  

我读到getchar()返回它读取的字符,

详细信息:int getchar(void);返回intunsigned char范围内的EOF。通常有257个不同的值,因此返回char是不够的。

  

我想知道这是否可以替代while(getchar() != '\n');来清除缓冲区。

遇到文件结尾时,

while (clearBuffer() != '\n');未定义的行为(UB)。 cChar中的scanf("%c", &cChar);未分配值,但已返回。 @alk

while (getchar() != '\n');是遇到文件尾的无限循环。

也不是一个可靠的解决方案。


一个简单的选择:

// Read and dispose of data from stdin until \n or EOF encountered
// Return \n or EOF
int clearBuffer1(void) {
  int ch;
  while ((ch = getchar()) != '\n' && ch != EOF) {
    ;
  }
  return ch;
}

答案 1 :(得分:-1)

我没有足够的声誉来发表评论,但是阅读整行然后转换为int

#include <stdio.h>
#include <stdlib.h>

char *get_line();

int main(void) {
    char *n;
    int num;
    do {
        printf("Enter N: ");
        n = get_line();
        num = atoi(n);
        printf("N is %d\n", num);
    } while (num != 0);
    free(n);
}

char *get_line()
    char *n = malloc(sizeof(char) * 12);  // no int has more than 11 chars
    int c;
    for (int i = 0; (c = getchar()) != '\n' && c != EOF; ++i) {
        // check if i < 11 or reallocate memory to read more chars
        n[i] = c;
    }
    n[11] = '\0';  // if memory reallocated then 11 is not the right value
    return n;
}

没有错误检查可使事情保持简单。

相关问题