草庐IT

C语言第11天,输入输出缓存和函数

麻木无聊 2023-03-28 原文

一、输出缓存

例题:输出"HelloWorld"十次,每次输出后暂停500毫秒。

#include<stdio.h>
#include<windows.h>
int main()
{
for (int i = 0; i <= 10; i++)
{
printf("helloworld%d ",i);
Sleep(500);
}
return 0;
}

在windows系统上,我们使用windows.h头文件中提供的Sleep函数,每次输出后休眠500毫秒。

//linux系统

#include<stdio.h>

#include<unistd.h>

int main()

{for(int i=0;i<10;i++)

{printf("HelloWorld%d",i);

usleep(1000*500);//使用usleep函数休眠500毫秒}

return 0;}

而在linux系统上,休眠5000毫秒,打印出所有HelloWorld

这是因为在windows系统下,使用printf后,数据被写入到输出缓存区。随后,立即刷新缓存区。

在linux系统下,使用printf后,数据被写入到输出缓存区。后续的printf会在缓存区积累数据,直到程序结束才刷新缓存区。

 

行缓存:一行结束后必须刷新缓存;

完全缓存:等到缓存区被填满,才刷新缓存。

所以只要Linux系统printf的%d后面加上\n就会实现目标

阻塞

#include<stdio.h>
int main()
{
char c1,c2;
c1=getchar();
putchar(c1);
getchar();//用于吸收'\n',不然\n会被c2吸收,从而c2将不会在输入
c2=getchar();
putchar(c2);
return 0;
}

程序运行到第一个getchar,由于输入缓存区没有数据,getchar进入阻塞状态,等待用户输入。在输入'A'并按回车后,"A\n"进入了输入缓存区。

第一个getchar获取了字符'A',解除阻塞状态,继续执行。接着用putchar打印c1。

执行到第二个getchar时,由于输入缓存区仍有字符'\n',第二个getchar将不进入阻塞状态,直接读取缓存区中的'\n',并继续执行。

2.不带缓存的输入函数

getch函数

#include<stdio.h>
#include<conio.h>
int main()
{
while (1)
{
char c;
c=_getch();//输入后,使用putchar打印在控制台上,_为vs的一种要求
putchar(c);
if(c=='q')
break;
}
return 0;

}

输入"1234567890q",程序立刻显示"1234567890q"并退出。

getche函数

与getch函数类似,不过它会自己将输入的字符打印在控制台上。getche函数相当于无缓存有回显的getchar。

#include<stdio.h>
#include<conio.h>
int main()
{
while (1)
{
char c;
c=_getche();//输入后,使用putchar打印在控制台上
if(c=='q')
break;
}
return 0;
}

输出结果与getch相同

请注意这两个函数需要包含头文件conio.h才可以被使用。

二、函数

 可以把函数看做一个盒子,这个盒子有如下几个特性:
1.开始执行时,函数可以被输入一些值
2.执行过程中,函数可以做一些事情
3.执行完成后,函数可以返回一些值
1.函数定义
函数的写法公式:函数返回值类型 函数名(函数输入参数值)
{做点什么事情
return函数返回值;}
被花括号包括的被称为函数体,注意函数体一定要被花括号包括且不可省略。花括号上面的函数名、函数参数及返回值被称作函数头。
例题:
定义一个加法函数
int add(int a,int b)//不能写成int a,b
{return a+b;}
2.函数的调用
#include<stdio.h>
int add(int a,int b)
{return a+b;}
int main()
{int result;
result=add(2,3);//函数调用
printf("%d",result);
return 0;}
main被称作主调函数,add被称作被调函数。在main中,将2,3两个参数传入了add函数,并调用add函数。
在add函数头中,标明了函数的返回值类型为int,说明这个函数被调用后将返回一个int类型的结果。所以,我们使用int类型的result变量存放add函数的返回值。
3.为什么要用函数
例题:求一个三角形面积
先用代码写一遍
#include<stdio.h>
#include<math.h>//sqrt需要包含math.h
int main()
{//输入a,b,c
double a,b,c,p,s;
scanf("%lf%lf%lf",&a,&b,&c);
//是否能构成三角形
if(a+b>c&&a+c>b&&b+c>a)
{printf("It's atriangle\n");}
else
{//无法构成三角形,程序结束。
printf("Notatriangle\n");
return 0;}
//求三角形的面积
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式
//输出结果
printf("s=%f",s);
return 0;}
 
再使用函数
#include<stdio.h>
#include<math.h>//sqrt需要包含math.h
double area Of Triangle(double a,double b,double c)
{double p,s;
//求三角形的面积
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
return s;}
 
int isTriangle(double a,double b,double c)
{//是否能构成三角形
if(a+b>c&&a+c>b&&b+c>a)
{return 1;}
return0;}
 
int main()
{//输入a,b,c
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
 
//是否能构成三角形
if(isTriangle(a,b,c)==0)
{printf("Not a triangle\n");
return 0;}
 
//求三角形的面积
double s;
s=area Of Triangle(a,b,c);
printf("area of triangle is %f",s);
return 0;}
优点是在主函数中可以反复调用
 
4.形参与实参相互独立
#include<stdio.h>
int main()
{int a,b;//形参
int temp;
a=1;b=2;//实参
printf("a=%d b=%d\n",a,b);
//交换a,b变量
temp=a;
a=b;
b=temp;
printf("a=%d b=%d\n",a,b);
return 0;}
 
结果为a=1 b=2
a=2 b=1
 
那么,如果将交换的代码写到函数里面呢?
#include<stdio.h>
void swap(int a,int b)
{int temp=a;
a=b;
b=temp;}
int main()
{int a,b;
int temp;
a=1;b=2;
printf("a=%d b=%d\n",a,b);
//交换a,b变量
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;}
 
结果为a=1 b=2
a=1 b=2,可以看到失败了
虽然主函数中的变量a,b与函数中的形式参数a,b变量名相同。但是,它们却是相互独立的变量。调用swap函数并传参时,是将主函数中变量a,b的值,传递给形式参数a,b
 
5.不同函数内的变量相互独立
#include<stdio.h>
void func()
{int a;
a=100;
printf("a in func %d\n",a);}
int main()
{int a=0;
printf("a in main %d\n",a);
func();
printf("a in main %d\n",a);
return 0;}

结果为a in main 0
a in func 100
a in main 0

main函数中声明了一个变量a,并初始化为0。func函数中也声明了一个变量,并赋值为100。从结果中可以看出,这两个变量虽然变量名相同,但是却是两个互相独立的变量

所以函数内声明的变量为局部变量,不同函数内的局部变量相互独立。

有关C语言第11天,输入输出缓存和函数的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  9. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

随机推荐