我读到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);
}
答案 0 :(得分:2)
我读到
getchar()
返回它读取的字符,
详细信息:int getchar(void);
返回int
或unsigned 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;
}
没有错误检查可使事情保持简单。