基本上,在每次打印之前,在windows的代码块中我有“fflush(stdin);”这很有效。当我将代码复制到Linux时,它不起作用,“fflush(stdin);”的任何替代方案也不起作用我找到了。无论我用哪种方式做,输入在缓冲区中似乎没有被清除,或者我的代码中的某些内容不正确。
#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <ctype.h>
int main()
{
char pbuffer[10], qbuffer[10], kbuffer[10];
int p=0, q=0, k=0;
int r, i, Q, count, sum;
char a[3];
a[0]='y';
while(a[0]=='y' || a[0]=='Y')
{
printf("Enter a p value: \n");
fgets(pbuffer, sizeof(pbuffer), stdin);
p = strtol(pbuffer, (char **)NULL, 10);
printf("Enter a q value: \n");
fgets(qbuffer, sizeof(qbuffer), stdin);
q = strtol(qbuffer, (char **)NULL, 10);
printf("Enter a k value: \n");
fgets(kbuffer, sizeof(kbuffer), stdin);
k = strtol(kbuffer, (char **)NULL, 10);
while(p<q+1)
{
Q=p;
sum=0;
count=0;
while(Q>0)
{
count++;
r = Q%10;
sum = sum + pow(r,k);
Q = Q/10;
}
if ( p == sum && i>1 && count==k )
{
printf("%d\n",p);
}
p++;
a[0]='z';
}
while((a[0]!='y') && (a[0]='Y') && (a[0]!='n') && (a[0]!='N'))
{
printf("Would you like to run again? (y/n) ");
fgets(a, sizeof(a), stdin);
}
}
return 0;
}
不再需要刷新输入缓冲区。
OP在正确的轨道上使用fget()
而不是scanf()
进行输入,OP应该继续这种方法:
char a;
while(a !='y' && a !='Y' && a!='n' && a!='N' ) {
printf("Would you like to run again? (y/n) \n");
if (fgets(kbuffer, sizeof(kbuffer), stdin) == NULL)
Handle_EOForIOerror();
int cnt = sscanf(kbuffer, " %c", &a); // Use %c, not %s
if (cnt == 0)
continue; // Only white-space entered
}
最好不要使用scanf()。
当前OP的某些烦恼源于
fgets()
在scanf(“%s”)之后,
通过仅对用户IO使用
fgets()
,消除了刷新的需要。
示例
fgets()
wrapper
char *prompt_fgets(const char *prompt, char dest, long size) {
fputs(prompt, stdout);
char *retval = fgets(dest, size, stdin);
if (retval != NULL) {
size_t len = strlen(dest);
if (len > 1 && dest[len-1] == '\n') { // Consume trailing \n
dest[--len] = '\0';
}
else if (len + 1 == dest) { // Consume extra char
int ch;
do {
ch == fgetc(stdin);
} while (ch != '\n' && ch != EOF);
}
return retval;
}
我认为你想做的事情比看起来要困难得多。
我对你所要做的解释是禁用提前键入,这样如果用户在你的程序处理其他东西时键入一些字符,它们就不会出现在提示符上。这实际上很难做到,因为它是操作系统级别的函数。
在打印提示之前,您可以在设备上执行非阻塞读取,直到在errno中获得ewoldblock。或者TceTattr函数系列可能会有所帮助。看起来有一种方法可以排出其中的文件描述符的输入,但它可能与fgets/fscanf交互不好
一个更好的办法是根本不用担心。Unix用户习惯于提前输入,您想要的是他们的意外行为。
调用fflush(stdin)
不是标准的,因此行为是未定义的(有关更多信息,请参阅此答案)。
您可以调用scanf,传递一个格式字符串,指示函数读取所有内容,包括换行符,如下所示:
scanf("%*[^\n]%1*[\n]");
星号告诉scanf
忽略结果。
另一个问题是调用scanf
将字符读入变量a
,格式说明符为“%s”
:当用户输入非空字符串时,null终止符会造成缓冲区溢出,导致未定义的行为(char a
是一个一个字符的缓冲区;string“y”
有两个字符-{'y','\0'}
,第二个字符写在缓冲区的末尾)。您应该将a
更改为具有多个字符的缓冲区,并将该限制传递给scanf
:
char a[2];
do {
printf("Would you like to run again? (y/n) \n")
scanf("%1s", a);
} while(a[0] !='y' && a[0] !='Y' && a[0]!='n' && a[0]!='N' );
}
C++ 重载运算符和重载函数 下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能。 下面的实例演示了如何重载下标运算符 []。 #include <iostream> using namespace std; const int SIZE = 10; class safearay { private: int arr[SIZE]; pu
本文向大家介绍C#常用数据结构和算法总结,包括了C#常用数据结构和算法总结的使用技巧和注意事项,需要的朋友参考一下 1.数据 数据(Data)是外部世界信息的载体, 是能够被计算机识别,加工,存储的。在现实生活中也就是我们的产品原材料。 计算机中的数据包括数值数据,图片,影音资料等. 2. 数据元素和数据项 数据元素(Data Element)是数据的基本单位,在计算机处理的过程中通常
本文向大家介绍C#常见算法面试题小结,包括了C#常见算法面试题小结的使用技巧和注意事项,需要的朋友参考一下 本文实例汇总了C#面试常见的算法题及其解答。具有不错的学习借鉴价值。分享给大家供大家参考。具体如下: 1.写出冒泡,选择,插入排序算法。 2.有一列数1,1,2,3,5,........求第30个数. 3. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。 4.有一个字符串 "I
问题内容: 为了解决这个问题,我使用x和y的不确定性进行拟合,使用scipy curve_fit进行正确拟合,包括x中的错误? 拟合之后,我想计算参数的不确定性。因此,我看一下协方差矩阵对角元素的平方根。我得到: 但是根据odr的文档,在其中也有 形状(p,)的估计参数的标准误差。 但是,它不会给我相同的结果: 编辑 这是笔记本上的示例:https : //nbviewer.jupyter.org
指针运算符加减标签操作 指针作为一种特殊的变量,它的运算和普通变量是有一定区别的。指针在运算中并没有具备其它变量所有的性能。我们只是给大家介绍一些指针常用的运算: 加法运算(+,++) 我们知道一个整型的变量可以为它做加法运算,那么指针变量加1之后是一个地址还是一个整型? int *p=xxx; [0x12] //有一个int类型的指针,它的指针变量存储的地址为0x12。 p=p+1; 由于p是
现代计算机都是基于冯·诺依曼或哈佛体系结构的,不管是嵌入式系统、个人电脑还是服务器。这种两种体系结构的主要特点是:CPU和内存是计算机的两个主要组成部分,内存中保存着数据和指令,CPU从内存中取指令执行,其中有些指令让CPU做运算,有些指令让CPU读写内存中的数据。 冯·诺依曼结构 冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储