替换fflush(stdin)

我有以下代码, fflush(stdin); print(“Enter y/n”); scanf(“%c”,&a); 在这里,它在输入之前就退出了。看起来问题是因为它没有刷新可能有一些垃圾字符的输入缓冲区。有什么替代的flush(stdin)。这个代码片段在Solaris中工作但它不适用于Linux。

在源代码中代表大数字以提高可读性?

是否有更人性化的方式来表示用C ++或C编写的应用程序的源代码中的大数字? 例如,如果我们想要一个程序返回这个数字我们会return 2345879444641 ,请使用C或C ++中的数字return 2345879444641 。 但这不是真的可读。 例如,在PAWN(脚本语言)中,我可以return 2_345_879_444_641或甚至return 2_34_58_79_44_46_41 ,这两者都将返回数字2,345,879,444,641 。 对于人眼来说,这更具可读性。 这有C或C ++的等价物吗?

在istream对象上扫描

注意:我看过post什么是scanf格式输入的cin analougus? 在提出问题之前,post并没有解决我的问题。 该post寻求C ++ – 这样做的方式,但正如我已经提到的那样,使用C ++是不方便的 – 有时这样做的方式我有明确的例子。 我试图从istream对象中读取数据,有时使用C ++风格的方法(例如operator >>)是不方便的,例如数据是特殊forms的123:456所以你必须灌输’:’as space(非常hacky,而不是%d:scanf中的%d),或00123,你想读取字符串并转换十进制而不是八进制(而不是scanf中的%d),以及可能的许多其他情况。 我选择istream作为接口的原因是因为它可以派生,因此更灵活。 例如,我们可以创建内存流,或者动态生成的一些自定义流等。另一方面,C风格的FILE *非常有限,至少在符合标准的方式下,创建自定义流。 所以我的问题是,有没有办法在istream对象上进行类似scanf的数据提取? 我认为fscanf内部使用fgetc从FILE *逐字符号读取,而istream也提供这样的接口。 因此可以通过复制和粘贴fscanf的代码并用istream对象替换FILE *来实现,但这非常hacky。 有没有更聪明,更清洁的方式,还是有一些现有的工作? 谢谢。

为什么我的scanf语句中的空格有所不同?

当我运行下面的代码时,它按预期工作。 #include int main() { char c; scanf(“%c”,&c); printf(“%c\n”,c); scanf(” %c”,&c); printf(“%c\n”,c); return 0; } 如果我删除第二次scanf调用中的空格( scanf(“%c”,&c); ),程序会出现第二次扫描的不良行为,扫描’\n’并输出相同的内容。 为什么会这样?

链接多个大于/小于运算符

在if语句中,我想包含一个范围,例如: if(10 < a < 0) 但通过这样做,我得到一个警告“毫无意义的比较”。 但是,这没有任何警告,工作正常: if(a>10 && a<0) 第一种情况可以在C中实现吗?

更快相当于gettimeofday

在尝试构建一个对延迟敏感的应用程序时,需要每秒发送100条消息,每条消息都有时间字段,我们要考虑优化gettimeofday。 首先想到的是基于rdtsc的优化。 有什么想法吗 ? 还有其他指针吗? 返回的时间值所需的精确度以毫秒为单位,但如果该值偶尔与接收器不同步1-2毫秒则不是很大。 试图比62纳秒的gettimeofday做得更好

在该示例中,C中的逻辑表达式的短路行为

程序 #include int main(void) { int i, j, k; i = 1; j = 1; k = 1; printf(“%d “, ++i || ++j && ++k); printf(“%d %d %d”, i, j, k); return 0; } 结果 1 2 1 1 我期待1 1 2 2.为什么? 因为&&优先于||。 所以我按照以下步骤操作:1)j加1,所以j现在值2 … 2)k加1,所以k现在值2 … 3)2 && 2,计算结果为1 … 4)不需要进一步评估作为||的右操作数 是的,所以整个表达式必须是真的,因为逻辑表达式的短路行为…… 为什么我错了?

指针 – 数组和指针之间的区别

a,&a,第一个元素a [0]的地址有什么区别? 类似地,p是指向整数但指定为数组地址的指针。 指针[]是否会执行指针运算并根据数据类型获取值? *期望什么价值? 它应该是指针吗? #include int main() { int a[]={5,6,7,8}; int *p= a; printf(“\nThis is the address of a %u, value of &a %u ,Address of first element %u , Value pointed by a %u”,a,&a,&a[0],*a); printf(“\nThis is the address at p %u , value at p %u and the value pointed by p […]

为什么故意不正确地使用strcpy不会失败呢?

为什么使用strcpy的下面的C代码对我来说效果很好? 我尝试以两种方式使其失败: 1)我尝试从字符串文字strcpy到分配的内存太小,不能包含它。 它复制了整个事情并没有抱怨。 2)我从一个非NUL -terminated的数组中尝试了strcpy 。 strcpy和printf工作得很好。 我曾经以为strcpy复制了char直到找到NUL ,但没有一个存在且仍然停止。 为什么不这些失败? 我是以某种方式获得“幸运”,还是我误解了这个function是如何工作的? 它是特定于我的平台(OS X Lion),还是大多数现代平台以这种方式工作? #include #include #include int main() { char *src1 = “123456789”; char *dst1 = (char *)malloc( 5 ); char src2[5] = {‘h’,’e’,’l’,’l’,’o’}; char *dst2 = (char *)malloc( 6 ); printf(“src1: %s\n”, src1); strcpy(dst1, src1); printf(“dst1: %s\n”, dst1); strcpy(dst2, src2); printf(“src2: %s\n”, […]

为什么你想要在堆而不是堆栈上分配内存?

可能重复: 何时最好使用堆栈而不是堆,反之亦然? 我已经阅读了关于堆与堆栈的其他一些问题,但它们似乎更关注堆/堆栈的作用而不是使用它们的原因。 在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针而不是在堆中查找空闲空间),并且在完成使用后不必手动释放已分配的内存。 我可以看到使用堆分配的唯一原因是,如果要在函数中创建对象,然后在函数作用域之外使用它,因为堆栈分配的内存在从函数返回后自动取消分配。 是否有其他原因使用堆分配而不是我不知道的堆栈分配?