首页 > 编程知识 正文

c语言scanf输入汉字,c语言中的scanf语句

时间:2023-05-05 16:52:42 阅读:151414 作者:2193

下面介绍输入函数scanf的使用方法。 scanf和printf

同样,非常重要,而且使用非常多,所以一定要掌握。

概要

scanf

的功能可以概括为:“通过键盘为程序中的变量赋值”。 函数原型如下。

#包含

intScanf(constchar*format,

那个有两种使用方法。 或者有两种格式。

1 )扫描(输入控件,输入参数);

功能:将从键盘输入的文字转换为“输入控件”规定格式的数据,保存在以输入参数值为地址的变量中。

举个例子:

#包含

输入

是主(语音)

{

输入

I;

i=

10;

printf(I=%d(n ),I );

返回

0;

}

我们之前这样写的。 也就是说,直接给变量I

给价。 但是,这样写的功能很弱。 因为这个值是“死亡的值”。 那是

10、只要不通过程序进行变更,就不是其他值。 在许多情况下,这个值不是程序员在程序中指定的,而是希望用户在程序运行时通过键盘输入的。 根据用户输入什么,变量I输入什么,程序的功能会更加灵活。

那么,如何实现用户在程序运行过程中通过键盘输出值呢? scanf可以实现的内容:

#

包括

输入

是主(语音)

{

输入

I;

scanf('%d ',I ); //i表示变量I

的地址是取地址符号

printf(I=%d(n ),I );

返回

0;

}

“输入控件”和“输出控件”一模一样。 例如经由printf整数数据

输出时用%d输出,用scanf输入时也同样用%d输出。

将程序中的scanf

行明白,首先要明确的是,我们从键盘输入的都是文字。 例如,如果从键盘输入123,它将表示字符'1'、字符,而不是数字123

'2'和文字'3'。 为什么会这样呢?

操作系统内核就是这样工作的。 操作系统在接收键盘数据时将其作为字符接收。 在这种情况下,需要在“输入控件”中进行转换。 %d意味着将通过键盘输入的这些有效字符转换为十进制。 %d转换后,字符

123是数字123。

二是取地址的运算符,在后面加上变量名表示“该变量的地址”,所以I表示变量I的地址。 I也称为“取得地址I”,相当于将数据存储在变量I中

的地址在地址变量中。

那么以变量I的地址为地址的变量是哪个变量呢? 这是变量I。 所以在程序中scanf

的结果,值123进入变量I。

如上所述,scanf语句的意思是从键盘输入字符

123、然后%d将这三个字符转换为十进制123,最后在“取地址I”中找到变量I的地址,将数字

123放入以变量I地址为地址的变量,即变量I中,因此最终的输出结果为i=123。

注意:为什么不直接说“放入变量I”? 就是“放入变量I”

的地址在地址变量中”? 这么说来有点绕圈子,因为可以加深对I的理解,这样说来就可以表达I了

本质和内涵。 很多人都知道,学习scanf的时候,开始混淆“变量I”和“变量I的地址”,思维开始混乱

I的意思之后就不用这么说了。

以上是scanf最简单的用法,也是最常用、最基本、最重要的用法。 这样通过scanf

允许用户在程序运行时指定变量I的值。 这比以编程方式赋值更强大。

2 ) scanf (输入控件非输入控件)、

输入参数;

这个使用方法几乎不用,建议永远不要使用。 但为什么printf

有“非输出控件”,scanf是

不能有“非输入控件”。 实际上不是不能有,而是没有必要! 让我们看一下步骤。

#

包括

输入

是主(语音)

{

输入

I;

scanf(I=%d ),I );

printf(I=%d(n ),I );

返回

0;

}

printf将按原样输出所有“非输出控件”

。同样,在 scanf

中,所有的“非输入控制符”都要原样输入。所以在输入的时候i=必须要原样输入。比如要从键盘给变量 i 赋值

123,那么必须要输入i=123才正确,少一个都不行,否则就是错误。

所以 scanf 中%d后面也没有必要加n,因为在 scanf 中n不起换行的作用。它不但什么作用都没有,你还要原样将它输入一遍。

所以在 scanf

的使用中一定要记住:双引号内永远都不要加“非输入控制符”。除了“输入控制符”之外,什么都不要加,否则就是自找麻烦。而且对于用户而言,肯定是输入越简单越好。

一次给多个变量赋值:

#

include

int

main(void)

{

int

i,

j;

scanf("%d%d", &i, &j);

printf("i = %d, j = %dn", i, j);

return

0;

}

首先,scanf

中双引号内除了“输入控制符”之外不要加任何“非输入控制符”。通过键盘给多个变量赋值与给一个变量赋值其实是一样的。比如给两个变量赋值就写两个

%d,然后“输入参数”中对应写上两个“取地址变量”;给三个变量赋值就写三个

%d,然后“输入参数”中对应写上三个“取地址变量”……

但是需要注意的是,虽然 scanf

中没有加任何“非输入控制符”,但是从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab

键隔开,用以区分是给不同变量赋的值。而且空格、回车或 Tab

键的数量不限,只要有就行。一般都使用一个空格。

此外强调一点:当用 scanf 从键盘给多个变量赋值时,scanf

中双引号内多个“输入控制符”之间千万不要加逗号,。

有些人觉得在输入的时候可以用逗号分隔,所以就在“输入控制符”之间用逗号隔开。这样做从程序的角度确实是可以的,但是建议大家不要这样做。在实际编程中这种写法是绝对不允许的,原因有两个:

首先逗号要原样输入的,有几个就要输入几个,少一个或多一个都不行;

其次,也是最主要的原因就是输入法的问题,在 scanf

中是在英文输入法下写的逗号,那么输入的时候如果是中文输入法下的逗号那也是错的。所以用逗号很容易出错。

最后再次强调:scanf“输入参数”的取地址符&千万不要忘了。这是初学者经常犯的错误。而 printf

中的“输出参数”是不带取地址符的,不要混淆了。

使用scanf的注意事项

1) 参数的个数一定要对应

在前面介绍 printf

时说过,“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。这句话同样对 scanf

有效,即“输入控制符”和“输入参数”无论在“顺序上”还是在“个数上”一定要一一对应。比如:

#

include

int

main(void)

{

char

ch;

int

i;

scanf("%c%d", &ch);

printf("ch = %c, i =

%dn", ch, i);

return

0;

}

在 VC++6.0

中的输出结果是:

a 6

ch = a, i = -858993460

这种错误是初学者经常犯的,由于粗心大意,少写一个参数。更严重的是,这种错误在编译的时候不会报错。printf

也是一样,即使“输出参数”少写了也不会报错,但从程序的功能上讲这么写就是错的。所以在编程的时候一定要避免这种错误的发生。

程序中为什么 i=–858993460?这个在《为什么要初始化变量》中讲过,当变量没有初始化的时候就会输出这个值。

在后面会讲到 scanf

是缓冲输入的,也就是说从键盘输入的数据都会先存放在内存中的一个缓冲区。只有按回车键后 scanf

才会进入这个缓冲区和取数据,所取数据的个数取决于 scanf 中“输入参数”的个数。所以上述程序中 scanf

只有一个输入参数,因此按回车键后 scanf 只会取一个数据。所以变量 ch 有数据,而变量 i

没有数据,没有数据就是没有初始化,输出就是 –858993460。

2) 输入的数据类型一定要与所需要的数据类型一致

在 printf 中,“输出控制符”的类型可以与数据的类型不一致,如:

#

include

int

main(void)

{

int

i =

97;

printf("i = %cn", i);

return

0;

}

在 VC++ 6.0 中的输出结果是:

i = a

但是在 scanf 中,对于从键盘输入的数据的类型、scanf

中“输入控制符”的类型、变量所定义的类型,这三个类型一定要一致,否则就是错的。虽然编译的时候不会报错,但从程序功能的角度讲就是错的,则无法实现我们需要的功能。比如:

#

include

int

main(void)

{

int

i;

scanf("%d", &i);

printf("i = %dn", i);

return

0;

}

在 VC++ 6.0 中的输出结果是:

a

i = -858993460

输出 –858993460 表示变量未初始化。为什么输入 a,变量 i

却显示未初始化呢?

在 scanf 中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab

等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。按回车键的时候 scanf

开始进入缓冲区取数据,从前往后依次取。

但 scanf 中 %d 只识别“十进制整数”。对 %d 而言,空格、回车、Tab

键都是区分数据与数据的分隔符。当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab

键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个

scanf 来获取。

但是如果 %d

遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。所以上面这个程序,虽然 scanf 进入缓冲区了,但用户输入的是字母

a,所以它什么都没取到就出来了,而变量 i 没有值,即未初始化,所以输出就是 –858993460。

但如果将 %d 换成 %c,那么任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab

键它都会取回。

不但如此,前面讲过,你从键盘输入 123,这个不是数字 123,而是字符 '1'、字符

'2' 和字符 '3',它们依次排列在缓冲区中。因为每个字符变量 char 只能放一个字符。所以输入“123”之后按回车,scanf

开始进入缓冲区,按照次序,先取字符 '1',如果还要取就再取字符 '2',以此类推。

如果都取完了还有 scanf

要取数据,那么用户就需要再输入。先写一个程序看一下:

#

include

int

main(void)

{

char

i,

j,

k;

scanf("%c%c%c", &i, &j, &k);

printf("i = %c, j = %c, k =

%cn", i, j, k);

return

0;

}

在 VC++ 6.0 中的输出结果是:

123

i = 1, j = 2, k = 3

从这个程序中我们看出,就单纯地输入

123,不加任何空格,按回车键之后就同我们所讲的一样,分别将字符 '1'、字符 '2' 和字符 '3' 赋给字符变量 i、j 和

k。

但是需要提醒大家注意的是,在之前程序中,因为 scanf 是 %d,所以 a

没有被取出来,还在缓冲区中。当遇到下一个 scanf 是 %c 时它就会被取出来。但是如果一直没有出现

%c,那么这时就会出现一个问题:scanf怎么取十进制整数?即使使用 %d,但是由于字符 a “挡”在最前面,scanf

进去先碰到的总是 a,也就无法取到它后面的整数,所以必须先将

a“弄走”。这就牵涉到“清空输入缓冲区”的概念,这个稍后再讲。

3) 在使用 scanf 之前使用 printf

提示输入

大家想一想,前面写的 scanf 程序有没有不足的地方?

程序写好之后,编译、链接、执行,然后弹出黑窗口,出现一个光标在那不停地闪。对于编写程序的人来说他知道要输入什么,但是对于用户而言,用户怎么知道是什么意思呢?所以之前的程序都缺少提示信息!因此在使用scanf之前,最好先用printf提示用户以什么样的方式输入,这样可以大大提高代码的质量。看看下面这个程序:

#

include

int

main(void)

{

int

i,

j;

printf("请输入两个值,中间以空格分隔:");

scanf("%d%d", &i, &j);

printf("i = %d, j = %dn", i, j);

return

0;

}

这样在执行的时候,用户一看就知道是要输入两个值,然后中间用空格隔开。所以这样写就更人性化、智能化了。

小结

scanf

的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:

在 scanf

的“输入参数”中,变量前面的取地址符&不要忘记。

scanf 中双引号内,除了“输入控制符”外什么都不要写。

“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。

“输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理,这个稍后再讲。

使用 scanf 之前先用 printf 提示输入。

只要掌握了以上五点,scanf

的使用基本上就没什么问题了。至于其他注意点,到后面讲数组和指针的时候再介绍。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。