而(getchar!=';\n';);清除缓冲区的替代方法
我读到而(getchar!=';\n';);清除缓冲区的替代方法,c,input,C,Input,我读到getchar()返回它读取的字符,所以我想知道这是否可以作为while(getchar()!='\n')的替代方法以清除缓冲区。我还没有看到任何类似的代码使用这种技术来清除缓冲区 #include <stdio.h> char clearBuffer(void) { char cChar; scanf("%c", &cChar); return cChar; } int main() { int n; do {
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);
}
#包括
字符清除缓冲区(空){
炭炭;
scanf(“%c”和&cChar);
返回cChar;
}
int main(){
int n;
做{
printf(“输入N:”);
scanf(“%d”和“&n”);
while(clearBuffer()!='\n');
printf(“N是%d\N”,N);
}而(n!=0);
}
我没有足够的声誉来评论,但是读整行然后转换成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;
}
#包括
#包括
char*get_line();
内部主(空){
字符*n;
int-num;
做{
printf(“输入N:”);
n=获取线();
num=atoi(n);
printf(“N是%d\N”,num);
}而(num!=0);
自由(n);
}
char*get_line()
char*n=malloc(sizeof(char)*12);//任何int的字符数都不超过11个
INTC;
对于(int i=0;(c=getchar())!='\n'&&c!=EOF;++i){
//检查i是否小于11或重新分配内存以读取更多字符
n[i]=c;
}
n[11]=“0”;//如果内存重新分配,则11不是正确的值
返回n;
}
没有错误检查来保持简单
我读到getchar()
返回它读取的字符
详细信息:intgetchar(无效)
返回无符号字符
或EOF
范围内的int
。通常是257个不同的值,因此返回char
是不够的
我想知道这是否可以作为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);
}
while(clearBuffer()!='\n')代码>是遇到文件结尾时的未定义行为(UB)<代码>cChar
在scanf(“%c”、&cChar)中代码>未指定值,但已返回
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;
}
它起作用了吗?你测量过它的性能吗?@LightnessRaceswithMonica,它似乎工作得很好。当我尝试输入一个字符时,它不会导致无限循环。clearBuffer()
可能会在检测到文件结尾时调用未定义的行为。读取整行代码是一个不错的选择,尽管这get\u line()
有缺点。1.它不返回字符串(no\0)2INT\u MIN
至少需要12个缓冲区。3) 用户输入可能超出预期4)不处理EOF
。5) atoi()
正在溢出。。。。。1-是的,我知道它有一些问题,但我错过了签名数字的\0
2-是吗?3和5-是的,这是我跳过的那种错误检查。4-虽然在评论中提到了它,并且我打算处理它,但是我忘记了,但是我现在修复了1、2和4。很好的改进。注:“无整数超过11位”更像“无整数超过11个字符”,如中所示-2147483648". n[11]='\0';
很奇怪。n[i]='\0';
在上次读取的字符后附加空字符更有意义。c!=EOF
在char
未签名时是个问题,因为它从来都不是真的。最好使用int c;
。哦,我是指chars。我做的n[11]='\0'
因为在我按enter键后shell似乎会附加一个'\0'
,所以我在末尾添加了它,以防溢出。谢谢你的提示,我现在已经更改了它。我可以问一下为什么返回类型是int而不是char吗?@Janjan函数只返回两个值中的一个:EOF',\n'
EOF
在int
范围。'\n'
在unsigned char
范围内为正。char
作为有符号的char
或unsignedchar
不一定对这两个值都进行编码。int
会进行编码。@janjanjan否。如果char
无符号,则无法对EOF
进行编码。如果char
有符号<代码>“\n”
可能大于CHAR\u MAX
。