c语言学习零碎整理(1):缓冲区

c语言学习零碎整理(11):怎样通过判断按键退出循环 c语言学习零碎整理(11):怎样通过判断按键退出循环                      -----温铭  blog.youkuaiyun.com/wayne92前几天在c#版中看到一个帖子:“如何用c#实现,在while (true)循环中,按Esc键退出循环?" 那时候以为只能用hook来监视键盘,看了看后面一些猩猩的回复,只怪自己c#太菜,都没有看明白:( 昨天在c版看到又有人问这个问题,其中cy 阅读详情

觉得学习一门语言有三个方面:一是语言本身的学习:语法,函数,特性等等;二是系统或计算机底层方面的了解:计算机的组成原理,操作系统额概念等等;三是算法和数据结构的学习.我想如果这三个方面学到融会贯通的话,就可以称为高手了吧.

我的整理中主要是第一和第二个方面,至于算法和数据结构,等到大三有时间的时候再去深入学习一下.(买了<算法导论>半年了,还没看多少,惭愧ing).

1,为什么要用缓冲区?
如:
  int c;
  FILE *istream,ostream;
  while( (c = getc(istream)) != EOF)
      putc(c,ostream);
getc和putc时以单个字节为单位的.
 而一次读一个字节,效率很低。大部分的效率提高是通过减少系统调用的次数得到的。当进行一个系统调用时,程序和内核之间模式切换的代价时相当大的,通常来说,如果需要获得非常高的效率,就要小心翼翼的减少程序中系统的调用次数。

2,什么是缓冲区?
标准I/O库针对这一情况实现了一个完美的缓冲区机制来避免效率的降低。首先,第一次getc调用将导致系统调用read将BUFSIZ个字符读入缓冲区(BUFSIZ是在<stdio.h>中定义的常量),该缓冲区是由标准I/O库创建的(缓冲区依然处于用户地址空间中)。但是getc只返回第一个字符,接着getc实际上是从缓冲区读入的字符。putc的机制一样。

3.关于getchar的缓冲区

举个例子吧.

#include<stdio.h>//原意是显示输入的两个字符
main()
{
int c;
c=getchar();
printf("%c/n", c);
c=getchar();
printf("%c/n", c);
return 0;
}
这个程序并不能得到正确的输出.因为getchar的缓冲区问题。
为了说明这一点,请看下面的程序。

#include<stdio.h>
main()
{
int c;
c=getchar();//这时,缓冲区中有c和回车符
printf("%c/n", c);//输出c
printf("%d/n",getchar()); // 这里将输出回车的ASCII的值,是10
c=getchar();
printf("%c/n", c);
printf("%d/n",getchar());//输出10

}
问题是在与:在输入一个字符后我们有敲了一个回车,问题出来了,在第一个程序中,第二个printf语句输出的不是是回车。

改为这样就可以了
#include<stdio.h>
main()
{
int c;
c=getchar();
printf("%c/n", c);
getchar(); //把回车符清掉
c=getchar();
printf("%c/n", c);
return 0;
}

这样做更可以说明问题,更好理解。
#include<stdio.h>
main()
{
int c;
c=getchar();
printf("%c/n",c);
c=getchar();
printf("%d/n",c);
printf("%c/n",getchar());
return 0;
}//对于这种问题,最好的方法是把输入的字符(包括回车符)写在纸上这样就容易出错。

4,linux里面的一个程序

学操作系统的时候,编了一个关于进程的小程序,不想也遇到了缓冲区的问题.

程序如下:

#include<stdio.h>
void createprocess(){
        int t;
        printf("123");
        t = fork();
        if(t != -1){
                if(t == 0)  printf("b");
                if(t > 0)    printf("a");
        }
}
                                                                               
int main(){
        createprocess();
}
结果是123a123b
为什么123会打印两次呢?
fork在打印123的语句下面啊. 

这就是我当初的疑问.后来再csdn上面发了个帖子问了一下,才明白,是缓冲区的问题.

printf出现在fork前,似乎应该出现一次,但由于没有换行符,或者用fflush将缓冲区内容输出,所以在fork时,“123”没有输出,还在缓冲区内,它的内容也被子进程所复制。父进程和子进程的缓冲区内,都有“123”。(谢谢 nichotilikai(lk) 的讲解.)

我是初学者,上面的内容也许会有错误或写的不清楚的地方,希望大家多多给我提意见,谢谢!

c语言 笨鸟先飞 利用c语言进行简单的编写游戏,虽然十分简陋,但是对于其他资源的要求十分低,感兴趣的可以看一看. 立即下载

相关推荐

c语言100个经典算法 c语言经典算法100例

c语言100个经典算法 c语言经典算法100例 很经典

c语言程序笨鸟先飞

c语言程序笨鸟先飞 题目描述 lin2144是一只小菜鸟,都是笨鸟先飞,lin2144想来个菜鸟先飞,他从0点出发 一开始的飞行速度为1m/s,每过一个单位时间lin2144的飞行速度比上一个单位时间的飞行速度快2m/s,问n (0 &amp;amp;lt; n &amp;amp;lt; 10^5)个单位时间之后lin2144飞...

Jiashun Hao的博客 2270

笨鸟先飞源码

笨鸟先飞小游戏源码

数据结构与程序设计实践期末大作业(编一个小游戏)————笨鸟先飞(C语言)

笨鸟先飞小游戏编程教学 对于这个游戏我做的比较粗糙,用一个圆球代替了小鸟,如果导致您觉得降低了逼格,请自行更改。 在写本小游戏前请先自行安装EGE图形库。 直接上代码,因为代码已经非常详细了。 视频讲解: //笨鸟先飞原创小游戏源代码 #include <graphics.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> // 函数外全局变量定义 int birdx,birdy;//小鸟

weixin_45434743的博客 3666

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1292

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

c++小游戏:笨鸟先飞(Flappy bird hhh)

这是一个疯狂的愤怒的笨鸟和柱子的故事hhhh

qq_45337491的博客 1万+

Godot 4.x 实现 JRPG 回合制战斗系统:架构、状态机与实战优化

游戏开发中,状态机是管理复杂逻辑流转的核心设计模式,尤其在回合制战斗这类事件驱动的场景中。其原理是通过定义有限的状态和明确的转移条件,来控制系统在不同阶段的行为,从而实现清晰、可维护的流程控制。这项技术的价值在于能够将杂乱的条件判断代码结构化,降低模块间的耦合度,提升代码的可读性和可扩展性。在游戏开发领域,状态机广泛应用于角色AI、UI流程、战斗系统等场景。本文以Godot引擎为例,深入探讨如何运用节点与信号驱动架构,构建一个健壮的JRPG(日式角色扮演游戏)回合制战斗系统。内容涵盖从核心的**状态机**设

weixin_33749242的博客 499

2169 笨鸟先飞

题目描述 阿龙同学很苦恼,为什么呢。 因为阿龙在刷题时,有很多题做不出来,阿龙心想我这么菜,这样下去可不行。 于是阿龙给自己制定了一个计划。 这个目标是这样的,如果当天学习两个小时以上的的算法。 就输出"阿龙你要坚持鸭,笨鸟先飞"。不包括""。 如果当天没有学习两个小时。 就输出3次"菜还不学习,大菜逼"。包括""。 来警醒自己。 输入 输入一个数字t,代表t组样例。 每一行有一个学习起始时间,学习结束时间。 输出 输出学习时长占一行。 然后输出当天是否达到自己的计划。 达到就输出"阿龙你要坚持鸭,笨鸟先飞

qq_51690362的博客 437

TCS34725颜色识别模块实战调校:从“一坨”例程到精准RGB

本文针对TCS34725颜色识别模块初始数据不准的问题,提供了从基础例程到精准调校的实战指南。核心在于通过白光校正与黑白光校正两种方法,补偿传感器偏差与环境光影响,将原始数据准确映射为标准RGB值。文章详细阐述了校准原理、操作步骤与代码实现,并分享了进阶调试技巧与避坑指南,帮助开发者显著提升颜色识别的准确性与项目可靠性。

weixin_29188043的博客 289

PD3.0详解 协议的时序timer和counter计数

前面介绍了关于PD协议的交互,还有协议层数据各个字段的含义,但是一直没有系统的说关于协议的时序,还有部分counter,就是协议允许发送的次数,或者一些其他计数。 大师匈今天说一下关于这方面的东西,这些东西都是非常关键的东西,但是相对来说PD标准内对时序的要求还是比较宽泛,非常容易能够实现这样的要求。 Timer 1、CRCReceiveTimer 0.9~1.1ms 表示每次通信收到goodcrc的时间,必须在这个时间内收到goodcrc, 我们要注意不是在0.9~1.1ms内,而是第三方可以在这个范

大师匈的博客 5007

c语言学习零碎整理(10):探讨scanf函数

scanf函数我曾经在这个函数上犯过不少错误,也看到别人犯过的错误,记下来,提醒自己不要重蹈覆辙了。如果对你有用,那就更好了:)如果你发现文章中有错误,欢迎你不吝赐教。希望和大家一起学习!(我的邮箱:moongbingbing@gmail.com    blog: http://blog.youkuaiyun.com/wayne92       温铭 )有关详细的scanf函数解释,大家可以去看看《C程序设计

wayne 我的陋室我做主 5795

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 297

初始C语言完结篇

目录 函数的初识 初始C语言中的数组 函数的初识 我们在数学中的函数可以表示为f(x)=2*x+5,C语言中的函数其实是很类似的f(x,y)=x+y;为了更加理解代码的意思我们将f换成Add,就变成了Add(x,y)=x+y。比如我们要计算两个数的和,首先我用非函数的方法为大家演示。 //这是用非函数的方法求俩个数的和 #include <stdio.h> int main() { int x = 0; int y = 0; scanf("%d%d", &.

m0_67568972的博客 831

opencode : 无法将“opencode“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

opencode命令识别问题与openclawcodexgemini确保的路径在 PATH 中。这个知识对所有 npm 全局工具通用。

一键难忘的博客 4521

基于YOLOv8的建筑材料分类系统:从数据集构建到UI界面实现

建筑材料分类数据集需要包含各种常见建筑材料的图像,并对每种材料进行标注。砖块(Brick)混凝土(Concrete)钢筋(Rebar)木材(Wood)瓷砖(Tile)玻璃(Glass)钢材(Steel)塑料(Plastic)石膏板(Drywall)绝缘材料(Insulation)如果没有找到合适的公开数据集,可以构建自己的数据集。使用智能手机或专业相机拍摄各种建筑材料的照片确保在不同光照条件、角度和背景下拍摄每类材料至少收集300-500张图像。

YOLO 489

仲恺ACM 1075:笨鸟先飞【java】

题目描述 多多是一只小菜鸟,都说笨鸟先飞,多多也想来个菜鸟先飞。于是它从0点出发,一开始的飞行速度为1m/s,每过一个单位时间多多的飞行速度比上一个单位时间的飞行速度快2m/s,问n(0 输入格式 先输入一个整数T表示有几组数据。每组数据输入一个n,表示多多飞行的时间。 输出 输出多多飞行了多远,因为数字很大,所以对10000取模。 样例输入 2 1

cwquan的博客 1749

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

printf的内容放在缓冲区里面还没有刷出来

【方案】:使用serial_putc()函数,代替printf()输出。 【原因】: printf将输出放到缓冲去以后,缓冲区没有满,之后一直在那死循环,什么都不做。 缓冲区的内容不变,不会输出;如果说程序能从while里跳出来,正常退出的话,也是可以输出来的。或者是你在while里面还有其他的输出内容,让缓冲区变满的话也可以输出来。在printf后面加fflush(stdout);和换行符...

Bill_Marz的博客 714

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++中stl入门之笨鸟先飞(一)

==装载连接—https://blog.youkuaiyun.com/piaoxuezhong/article/details/54348787 对于c语言已经学的出神入化的我,呃呃还是准备学习c++把从stl入手(Standard Template Library)标准模板库,是一个具有工业强度的,高效的C++程序库,该库包含许多计算机科学领域所常用的基本数据结构和基本算法。为广大c++程序员提供了一个可扩...

oooooooooooooookjk的博客 610

笨鸟先飞学编程系列之 指针

是啊,不可避免的,我们要学习指针了。关于指针的概念,我们已经在第一章节 理解程序中的数据 课题中大概的介绍过了,我想它并不是一个很难的概念,如果对指针没有任何一点概念的朋友可以试着百度一下,再看一下我们以前的章节。          之所以把指针放到现在来讲,一方面是

qinbaby的专栏 809

算法导论 影印版 勘误

引自:http://www.cs.dartmouth.edu/~thc/clrs-2e-bugs/bugs.phpSeverity levels A minor typographical error that should not affect your understanding (46 errors in first printing). A minor technical or expos

wayne 我的陋室我做主 4237
上一篇: 我的c学习心得(零碎收拢) 序:
下一篇: c语言学习零碎整理(2):结构体对齐问题
wayne92
博客等级 码龄23年 55粉丝 176原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值