浅谈C语言中scanf,gets函数区别与联系

| 收藏本文 下载本文 作者:路客

下面就是小编给大家带来的浅谈C语言中scanf,gets函数区别与联系(共含4篇),希望大家喜欢阅读!同时,但愿您也能像本文投稿人“路客”一样,积极向本站投稿分享好文章。

浅谈C语言中scanf,gets函数区别与联系

篇1:浅谈C语言中scanf,gets函数区别与联系

众所周知,scanf函数和gets函数是从键盘输入数据的函数,其基本函数功能这里不做过多赘述,只对两个函数易错点深入分析。

int main{ char a[20]; char b[20]; char c[20]; printf(“请输入a字符串\n”); scanf(“%s”,&a); printf(“请输入b字符串\n”); gets(b); printf(“请输入c字符串\n”); gets(c); return 0;}

【分析】程序本意是输入三个字符串,之所以用printf提示输入是因为想更清楚地看清程序怎么运作的,可以从运行界面看到程序提示输入a字符串和c字符串,但是会越过b字符串不让输入。这里会让人感到困惑。

因为scanf函数在读取字符串时,遇到回车、空格、制表符不会进行读取或转换,会舍弃掉它们以及它们后面的字符至缓冲区,最后在读取的字符后面加上‘\0’.因此到了gets(b)的时候就会读取缓冲区剩下的东西以及最后的换行符就结束了,所以程序不会提示输入b字符串,但是从监视可以看到b中其实是读取了字符串的。然后缓冲区无剩余字符gets(c)可以实现输入c字符串。而且从这个程序也可以体现出来需要用到里面有空格的字符串的时候可以用gets函数。

这里还有一个注意点:在gets(c)读取从键盘输入的字符以及最后需要将缓冲区的数据刷新出去的回车符。它和scanf不同的是不会舍弃回车符至缓冲区中, 而是会丢弃换行符将其改为字符串结束标志‘\0’,

所以我们一般喜欢使用这种带有清理收尾工作的输入函数。

最后一个点,我们可以看到b字符串其实读取的是缓冲区中的垃圾数据。因此,为了避免输入流缓冲区中垃圾数据对后续读入的影响,需要清空缓冲区。

下面就介绍方法(不同平台)

C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。

对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)

scanf函数读取字符

int main(){ char ch1; char ch2; char ch3; char ch4; scanf(“%c”,&ch1); scanf(“%c”,&ch2); scanf(“%c”,&ch3); scanf(“%c”,&ch4); return 0;}

【分析】用户输入'h'和' '和两个回车符,在监视中可以看到,四个字符如愿以偿得到了用户输入操作的四个字符,也并没有舍弃回车符到缓冲区。

篇2:浅谈C语言中scanf,gets,getchar函数区

众所周知,scanf函数和gets函数是从键盘输入数据的函数,其基本函数功能这里不做过多赘述,只对两个函数易错点深入分析。

int main(){ char a[20]; char b[20]; char c[20]; printf(“请输入a字符串\n”); scanf(“%s”,&a); printf(“请输入b字符串\n”); gets(b); printf(“请输入c字符串\n”); gets(c); return 0;}

【分析】程序本意是输入三个字符串,之所以用printf提示输入是因为想更清楚地看清程序怎么运作的,可以从运行界面看到程序提示输入a字符串和c字符串,但是会越过b字符串不让输入。这里会让人感到困惑。

因为scanf函数在读取字符串时,遇到回车、空格、制表符不会进行读取或转换,会舍弃掉它们以及它们后面的字符至缓冲区,最后在读取的字符后面加上‘\0’.因此到了gets(b)的时候就会读取缓冲区剩下的东西以及最后的换行符就结束了,所以程序不会提示输入b字符串,但是从监视可以看到b中其实是读取了字符串的。然后缓冲区无剩余字符gets(c)可以实现输入c字符串。而且从这个程序也可以体现出来需要用到里面有空格的字符串的时候可以用gets函数。

这里还有一个注意点:在gets(c)读取从键盘输入的字符以及最后需要将缓冲区的数据刷新出去的回车符,

它和scanf不同的是不会舍弃回车符至缓冲区中, 而是会丢弃换行符将其改为字符串结束标志‘\0’。所以我们一般喜欢使用这种带有清理收尾工作的输入函数。

最后一个点,我们可以看到b字符串其实读取的是缓冲区中的垃圾数据。因此,为了避免输入流缓冲区中垃圾数据对后续读入的影响,需要清空缓冲区。

下面就介绍方法(不同平台)

C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。

对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)

scanf函数读取字符

int main(){ char ch1; char ch2; char ch3; char ch4; scanf(“%c”,&ch1); scanf(“%c”,&ch2); scanf(“%c”,&ch3); scanf(“%c”,&ch4); return 0;}

篇3:C语言中break与continue的区别

C语言中break与continue的区别

break 关键字很重要,表示终止本层循环,现在这个例子只有一层循环,当代码执行到break 时,循环便终止。

如果把break 换成continue 会是什么样子呢?continue 表示终止本次(本轮)循环。当代码执行到continue 时,本轮循环终止,进入下一轮循环。

while(1)也有写成while(true) 或者while(1==1) 或者while((bool) 1)等形式的,效果一样。

do-while 循环:先执行do 后面的代码,然后再判断while 后面括号里的值,如果为真,循环开始;否则,循环不开始。其用法与while 循环没有区别,但相对较少用。

for 循环:for 循环可以很容易的控制循环次数,多用于事先知道循环次数的情况下,

《C语言中break与continue的`区别》()。

拓展:

我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?

在C 语言中, 类型转换意味着“把这些二进制位看作另一种类型, 并作相应的对待”; 这是一个转换操作符, 根据定义它只能生成一个右值(rvalue)。而右值既不能赋值, 也不能用++ 自增。(如果编译器支持这样的扩展, 那要么是一个错误, 要么是有意作出的非标准扩展。) 要达到你的目的可以用:p = (char *)((int *)p + 1);

或者,因为p 是char * 型, 直接用p += sizeof(int);

但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地试图李代桃僵。

篇4:Go语言中普通函数与方法的区别分析

作者:books1958 字体:[增加 减小] 类型:转载

这篇文章主要介绍了Go语言中普通函数与方法的区别,以实例形式对比分析了普通函数与方法使用时的区别与相关技巧,需要的朋友可以参考下

本文实例分析了Go语言中普通函数与方法的区别,分享给大家供大家参考。具体分析如下:

1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。

2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。

以下为简单示例:

代码如下:

package structTest

//普通函数与方法的区别(在接收者分别为值类型和指针类型的时候)

//Date:2014-4-3 10:00:07

import (

“fmt”

)

func StructTest06Base() {

structTest0601()

structTest0602()

}

//1.普通函数

//接收值类型参数的函数

func valueIntTest(a int) int {

return a + 10

}

//接收指针类型参数的函数

func pointerIntTest(a *int) int {

return *a + 10

}

func structTest0601() {

a := 2

fmt.Println(“valueIntTest:”, valueIntTest(a))

//函数的参数为值类型,则不能直接将指针作为参数传递

//fmt.Println(“valueIntTest:”, valueIntTest(&a))

//compile error: cannot use &a (type *int) as type int in function argument

b := 5

fmt.Println(“pointerIntTest:”, pointerIntTest(&b))

//同样,当函数的参数为指针类型时,也不能直接将值类型作为参数传递

//fmt.Println(“pointerIntTest:”, pointerIntTest(b))

//compile error:cannot use b (type int) as type *int in function argument

}

//2.方法

type PersonD struct {

id  int

name string

}

//接收者为值类型

func (p PersonD) valueShowName() {

fmt.Println(p.name)

}

//接收者为指针类型

func (p *PersonD) pointShowName() {

fmt.Println(p.name)

}

func structTest0602() {

//值类型调用方法

personValue := PersonD{101, “Will Smith”}

personValue.valueShowName()

personValue.pointShowName()

//指针类型调用方法

personPointer := &PersonD{102, “Paul Tony”}

personPointer.valueShowName()

personPointer.pointShowName()

//与普通函数不同,接收者为指针类型和值类型的方法,指针类型和值类型的变量均可相互调用

}

希望本文所述对大家的Go语言程序设计有所帮助,

C语言中函数和指针的参数传递

教学设计与教案的区别与联系

试论两种经济责任审计报告的联系与区别

for和since的用法区别和联系

解析C语言中的sizeof.net

英汉语言中的“红”“白”“黑”

变量与函数说课稿

集体合同与劳动合同区别

办法与实施细则区别

house与home区别

浅谈C语言中scanf,gets函数区别与联系(精选4篇)

欢迎下载DOC格式的浅谈C语言中scanf,gets函数区别与联系,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档