C语言几个输入函数的区别(C语言专家编程成长日记)

The difference of the string and the character(char):

字符串是一个带有""的字符序列如

"I fuck xuqiang"
annotation:双引号不是字符串的一部分。双引号告知编译器它括起来的是字符串。C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。字符串常量"x"和字符常量'x'不同,区别之一在于'x'是基本类型(char),而"x"是派生类型(char数组);区别之二是"x"实际上由两个字符串组成:'x'和空字符\0

在C语言中有很多的输入函数比如scanf()、getchar()、gets(),但它们之间的差别在哪里呢?

1:

首先针对scanf()函数:比如scanf() 配合%s使用,scanf("%s",&a) 但是这种方法只能获取一个单词,即遇到空格等空字符就会返回。如果要读取一行字符串。如果你需要输入"I fuck xuqiang everday",这个函数将显得很农民。

2:scanf()函数的特点:

转换修饰符
修饰符 意义
* 滞后赋值;示例:"%*d"
digit(s) z最大字段宽度;在达到最大字段宽度或者遇到第一个空白字符时(不管哪个先发生都一样)停止对输入项的读取;示例:"%10s"
hh b把整数读作signed char或unsigned char;示例:"%hhd" "%hhu"
ll b把整数读作long long或unsigned long long(c99);示例:"%lld" "%llu"
h,l或L "%hd"和"%hi"指示该值将会储存在一个short int中。"%ho"、"%hx"和"%hu"指示该值将会储存在一个unsigned short int中。"%ld"和"%li"指示该值将会储存在一个long中。"%lo"、"%lx"和"%lu"指示该值将会储存在一个unsigned long中。"%le"、"%lf"和"%lg"指示该值以double类型储存。将L(而非l)与e、f和g一起使用指示该值以long double类型储存。如果没有这些修饰符,d、i、o和x指示int类型,而e、f和g指示float类型;

 

转换说明符
转换说明符 意义
%c 把输入解释称一个字符
%d 把输入解释称一个有符号十进制整数
%e,%f,%g,%a 把输入解释称一个浮点数(%a是c99标准)
%E,%F,%G,%A 把输入解释称一个浮点数(%A是c99标准)
%i 把输入解释称一个有符号十进制整数
%o 把输入解释称一个有符号八进制整数
%p 把输入解释称一个指针(一个地址)
%s 把输入解释称一个字符串,输入内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释称一个无符号十进制整数
%x,%X 把输入解释称一个无符号十六进制整数
[] 字符集合
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.

 Scanf()和getchar()小细节:

1、getchar()读取每个字符,包括空格、制表符和换行符;而scanf则会跳过空格、制表符和换行符。

#include <stdio.h>
int main()
{
	int guess = 1;
	printf("pick an interger from 1 to 100,.I will try to guess");
	while (getchar() != 'Y')
	{	
            printf("Well ,then,is it %d?\n", ++guess);
            while(getchar()==!'\n')//将enter符号忽略掉。
                  continue;
    }
	printf("I knew I could do it!\n");
	return 0;
}                    

  

 不加getchar()=='\n' 

    加了过后

 

 成功处理掉了getchar()接收'\n'的情况。

 如果只用getchar()会将你的Enter键一起读入(getchar每次读入一个字符,就会识别你的每一次输入为两个字符一个数字,一个回车)造成了此问题。

经过改进(将getchar()和scanf()配合使用:

2、scanf()混合输入的细节

首先看一个例子:

#include <stdio.h>

int main()
{
	int i=0, j = 0;
	scanf("%d,%d",&i,&j);
	printf("%d,%d", i, j);
	return 0;
}

  如果要输入连续两个变量的值,那么你就必须在输入第一个值后面加上%d后面相同的符号。如本例:(此地方注意一定要与%d后面的符号完全相同,包括符号的大小写(,,中文逗号和英文逗号都不一样)。

 

 3、重要细节scanf("%c",ch)和scanf(" %c",ch)(%c前面有一个空格):

第一种会读取输入的第一个字符,第二种会读取输入的第一个非空字符,跳过空格。并且除了%c其他的转换都会自动跳过带输入值前面的所有的空白。

fputc()、putc()和fgetc()、fgetc()的区别:

  首先我们看原函数定义

  1:int fgetc(FILE *STREAM);int getc(FILE *stream);

  2:int fputc(int c,FILE *stream);int puc(int c,FILE *stream);

  Firstly,我们先来看fgetc、getc的差别。通过翻阅C primer后发现fgetc和getc的区别在于它们的实现上。带f的函数实现是通过函数来实现的,而不带f的函数(getc,putc),实现的时候是通过宏定义来实现的。

  书上这样说:

  1.getc的参数不应当是具有副作用的表达式。

  2.因为fgetc一定是一个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。

  3.调用fgetc所需时间很可能长于调用getc,因为调用函数通常所需的时间长于调用宏。

综上所述:用就完事了 少BB,在一般的工程可以等同使用影响不大。

解析putchar和getchar():

 

getchar() 用于读取用户从键盘输入的单个字符,它有一个整型的返回值,当发生读取错误的时候,返回整型值-1,当读取正确的时候,它会返回用户从键盘输的第一个字符的ASCII码,当程序调用getchar时.运行程序时就等着用户从按键输入,用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中),当用户键入回车之后,getchar才开始从输入流中每次读入一个字符,输入的字符不只一个的时候,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完之后,才等待用户按键,getchar函数输入数字也按字符处理,单个的getchar函数输入多于一个字符时,只接收第一个字符.

 

 

 由于getchar()只接受了一个字符,故putchar只输出一个字符到屏幕上。

putchar()

 

putchar()向终端(屏幕)输出一个字符。其格式为putchar(ch),其中ch可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127)(超过127就不是ASCII码了),也可以是事先用char定义好的一个字符型变量当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符),当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。当整型变量ch超出8位变量的范围时,ch则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位
getchar() and putchar()都需要包含stdio.h头文件;

posted @ 2019-03-25 11:50  雷雷提  阅读(1661)  评论(0编辑  收藏  举报