而(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)2
INT\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
或unsigned
char
不一定对这两个值都进行编码。
int
会进行编码。@janjanjan否。如果
char
无符号,则无法对
EOF
进行编码。如果
char
有符号<代码>“\n”
可能大于
CHAR\u MAX