c语言随机char型,C语言中的一些小知识点(EOF,getchar,随机函数)

1,EOF(End Of File)

EOF又叫文件结束符,是一个计算机术语。当我们用函数读取文件的时候,函数总是会返回一个状态,用EOF表示,其值一般为-1。执行代码与结果如图:

在Windows系统中,我们使用Ctrl+Z来打印EOF,在Linux中我们使用Ctrl+D。

其他:

(1),scanf()函数只有当第一个输入参数值为NULL时才会返回EOF

(2),getchar()函数中的EOF使用方法在getchar()中再来详谈。

2,getchar()函数详解

在C语言中,我们常常使用getchar()来实现字符类型数据的录入。该函数可从终端获得一个字符的ASCII码值,注意!返回的是ASCll码值,而不是字符类型,所以我们常常会使用int 类型来存储它的值,而不是char类型。

另外需要注意的一点就是,当我们在终端中输入字符的时候并不会立刻执行,需要我们按下回车才可以继续运行。getchar是以行为单位进行读取的,当我们输入一连串的字符类型的数据时,我们这些数据会缓冲在键盘缓存器中,直到回车换行一次性将所有字符按序依次赋给相应的变量(由于我们需要按下回车才可以继续运行,这就使得我们获取的字符中的最后一个永远是‘\n’,即换行符)。

由于getchar()的返回值为输入字符的ASCll码值,是非负的,因此我们常常写代码:

cef44bb4f3a8f9a0d347cf27a5fee68a.png

这行代码是存在一定问题的,当我们输入EOF(window 下Ctrl+Z,Linux 下Ctrl+D)或者读取错误时,getchar的返回值为-1,而-1是不在ASCll码表中的,使用char来定义就会产生一些错误。因此,为了避免这一类错误的发生,我们一般有如下的定义代码:

05d65a5505f963a1de86a2b75e1a77f4.png

EOF在getchar()中的使用,总结为以下两点:

1,  EOF作为文件结束符:当getchar()提示新的一次输入时,直接输入Ctrl+Z时才会被当作文件结束符来使用。

2,  EOF作为行结束符:在字符后面输入Ctrl+Z时会当作行结束符来使用。

示例:

有如下代码:

72415d85d7d7b255c7ea8156f06d44e5.png

当我们输入字符123时,按下回车键,我们可以看到123被输出后自动换了一行,

这是因为我们按下回车键的时候,‘\n’换行符也被录入了键盘缓冲区,输出来后自然也会换行。

d90369084e18a0bf9f234549c2090ea5.png

当我们在新的输入中直接使用Ctrl+Z时,程序直接结束此时EOF作为文件结束符来使用。

fe981054cf63dfbaebfe4949bca670ad.png

b572f2d31147ef071b739a09c934178a.png

当我们在字符后面输入EOF,我们发现输出的123后面没有换行,说明其到EOF处就不再录入。

06d9ed8935985b66e95c20972ff4b3d1.png

3,随机函数详解

在说随机函数之前我们先来了解一下C语言中随机数的产生机制:在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是voidsrand( int a)。---参考文献二

由以上的原理介绍我们可以知道,C语言中的随机数属于伪随机,且与两个函数密切相关(srand,rand),那么接下来我们就详细讲解一下这两个函数。

使用随机数需要包含头文件stdlib

f705df3a393358bf29c0ff35bd4a3708.png

(1),rand()—产生随机数

rand函数产生随机数有范围:0~32767

rand函数每次调用都会查询srand(seed)是否给seed设定了一个值,有的话会调用seed值来产生随机数,没有会自动赋一个初始值。

(2),srand(seed)—随机数发生器的初始化函数

rand()产生随机数时,如果用srand(seed)播下种子之后,一旦种子相同,产生的随机数将是相同的。为了让rand()产生的随机数随机化,我们使用用时间作种子srand(time(NULL)),这样每次运行程序的时间肯定是不相同的,产生的随机数肯定就不一样了。

注释:其中的time(time_t *tloc)可以用来获取系统当前的时间,需要包含头文件time

fc67aac9f8c0bcddc869ff6887366c1e.png

其中的参数用NULL或者0,表明其不需要将获取的结果传递到某个参数。

使用的一些技巧:

表示0~100之间的随机数:int num = rand() % 100;

表示1~100之间的随机数:int num = rand() % 100+1;

表示0~10之间的随机数:int num = rand() % 10;

示例:

a73a9a785a97ec4ba51d2d3431014b34.png

当不进行seed初始化时,我们运行4次,发现结果都是41:

2190c6889018d7a639d437ab80df4e46.png

2190c6889018d7a639d437ab80df4e46.png

2190c6889018d7a639d437ab80df4e46.png

2190c6889018d7a639d437ab80df4e46.png

81c8a5a0d66a8826d59a5bd8be1faf99.png

进行seed初始化,我们运行4次,结果如下,发现每次都不相同:

c7d1b0af696d351c6caaaf8aff83fb8c.png

53cff3c474622804a9de3ebf50e49f50.png

以上就是今天的一些小知识的分享啦,喜欢的同学不要忘了点个关注嗷(●’◡’●)

参考文献:

一:https://blog.csdn.net/meidong52617/article/details/44728517#comments

二:https://blog.csdn.net/qq_41658437/article/details/79156564

三:https://blog.csdn.net/lvyibin890/article/details/80141412

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值