第四章 键盘输入和屏幕输出

提示:本文参考书为《C语言程序设计》第四版,苏小红编著。


提示:以下是本篇文章正文内容,下面案例可供参考

一、单个字符的输入/输出

1.字符常量

字符常量是用单引号括起来的一个字符,但不适用于某些控制字符(如回车符、换行符等)。
例如:'3'表示一个数字字符,而3则表示一个整数数值
转义字符:以反斜线( \ )开头的字符序列来描述特定的控制字符。

常见的转义字符见下表

字符含义
‘ \n ’换行
‘ \r ’回车(不换行)
‘ \0 ’空字符,通常用作字符串结束标志
‘ \t ’水平制表(相当于按了一下tab键)
‘ \v ’垂直制表
‘ \b ’退格
‘ \f ’走纸换页
‘ \ " ’一个双引号
‘ \ ‘ ’一个单引号
‘ \ \ ’一个反斜线
‘ \? ’问号
‘ \ddd ’1到3位八进制ASCⅡ码值所代表的字符
‘ \xhh ’1到2位十六进制ASCⅡ码值所代表的字符

字符在内存中存储的是对应的ASCⅡ码的二进制值(就是一个整型数,可作算术运算,但与整型数不同的是char型数据只占1个字节)
小写英文字母ASCⅡ码值比相应的大写字母字母ASCⅡ码值大32。

2.字符的输入/输出

getchar()putchat()是C标准函数库中专门的字符输入/输出函数。
形式为:变量名 = getchar()putchar(变量名);

//大写字母转换成小写字母
#include<stdio.h>
int main(void)
{
    char ch;
    printf("Press a key and then press Enter:");
    ch = getchar();
    ch = ch + 32;
    putchar(ch);
    putchar('\n');
    return 0;
}
//程序运行结果
Press a key and then press Enter:A
a

也可以用 printf("%c,%d\n",ch,ch);输出变量的值。这里%d输出的是十进制整型格式就是说输出的是它的ASCⅡ码值。

#include <stdio.h>
int main()
{
	char ch;
	printf("Press a key and then press Enter:");
	ch=getchar();
	ch=ch+32;
	printf("%c,%d\n",ch,ch);
	return 0;
}
//运行这个程序,程序的输出结果是:
Press a key and then press Enter: b↙
?, -126
为什么会输出这样的结果?如何避免?

b的ASCⅡ码值为98 ,加上32后为130,char型数据占1个字节,有符号型char的取值范围是-128~127,对应的二进制是00000000~11111111,130的二进制表示为1000 0010,最高为1,char类型会将1000 0010看成是一个负数,补码为1000 0010的负数为-126,所以会输出-126。

3.用getchar()输入数据存在的问题

函数getchar()的作用是从键盘读字符。当程序调用getchar()时,程序就等待用户按键,用户从键盘输入的字符会被首先放在输入缓冲区中,直到用户按下回车键为止(回车符也会被放到输入缓冲区中)。当用户键入回车后,getchar()才开始读取字符,并且每次调用直读取一个字符,其返回值是用户输入的字符的ASCⅡ码,若遇到文件结尾(End-Of-File),则返回-1,且将用户输入的字符回显到屏幕上。如果用户在按回车之前输入了多个字符,那么其他字符会继续留在输入缓存区中,等待后续getchar()函数调用来读取,即后续的getchar()调用直接从缓冲区中读取字符,直到缓冲区中的字符(包括回车)全部读取完后,才会等待用户按键,只要缓冲区中有字符就不会等待用户的按键操作。

为什么getchar()要读到一个回车符或文件结束符EOF才进行一次处理操作呢?
为什么getchar()以行(而非字符)为单位读取字符呢?
*实际是按文件的方式读取字符
*文件一般都是以行为单位的

有时getchar()也可能返回负值
char ch; ch = getchar();这时返回值是输入的第一个字符的ASCⅡ码值(通常非负)
int ch; ch = getchar();解决返回值出现负数的问题

//例
#include <stdio.h>
int main()
{
    char ch1, ch2;
    ch1 = getchar();
    printf("ch1=%c\n", ch1);
    ch2 = getchar();
    printf("ch2=%c\n", ch2);
    return 0;
}

二、数据的格式化屏幕输出

1.函数printf()的一般形式

printf("格式控制字符串");
printf("格式控制字符串",输出值参数表);
格式控制字符串包括两部分:格式转换说明和需原样输出的普通字符。

函数printf()的格式转换说明见下图:

在这里插入图片描述

//输入一个大写字母将其转换成小写字母,并和相应的十进制ASCⅡ码值显示到屏幕上
#include <stdio.h>
int main (void)
{
    char ch;
    printf ("Press a key and then press Enter:");
    ch = getchar ();
    ch = ch + 32;
    printf ("%c, %d\n", ch, ch);
    return 0;
}
//程序运行结果如下:
Press a key and then press Enter:B
b, 98

2.函数printf()中的格式修饰符

在函数printf()的格式说明中还可在%和格式符中间插入下图所示的格式修饰符,用于对输出格式进行微调。

在这里插入图片描述

//使用const常量定义圆周率,编程从键盘输入圆的半径r,计算并输出圆的周长和面积。
#include <stdio.h>
int main (void)
{
	const double pi = 3.14159;
    double r,circum,area;
    printf ("Input r:");
    scanf ("%lf", &r);
    circum = 2 * pi * r;
    area = pi * r * r;
    printf ("printf WITHOUT width or precision specifications: \n");
    printf ("circumference = %f, area = %f\n", circum, area);
    printf ("printf WITH width and precision specifications: \n");
    printf ("circumference = %7.2f, area = %7.2f \n", circum, area);
    //%7.2f表示输出数据所占宽域为7就是占7个字符宽度(小数点也占1个字符),显示精度为2就是保留两位小数.
    return 0;
}
//程序运行结果如下:
Input r:5.3
printf WITHOUT width or precision specifications: circumference = 33.300854, area = 88.247263
printf WITH width and precision specifications: circumference =   33.30, area =   88.25 

三、数据的格式化键盘输入

1.函数scanf()的一般形式

scanf(“格式控制字符串”,参数地址表);

函数sancf()的格式转换说明符见下图:
在这里插入图片描述

2.函数scanf()的格式修饰符

与printf()类似,sancf()的%和格式符中间也可插入下图所示的格式修饰符。

在这里插入图片描述


  • 在用函数scanf()输入数值型数据时,遇到以下几种情况都认为数据输入结束:
  1. 遇空格符、回车符、制表符(Tab);
  2. 达到输人域宽;
  3. 遇非法字符输入。

  • 常见错误:
  1. scanf(“%7.2f”, &a);
  2. scanf(“%f”, a);
  3. scanf(“%f\n”, &a);

//问题:修改这个程序,使用户可以以任意字符(回车、空格、制表符、逗号、其他)作为分隔符输入数据
#include  <stdio.h>
int main() 
{ 
int  a, b;
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
//%d %d"中间的空格改为”%*c

注意,如果函数scanf()的格式控制字符串中存在除格式说明符以外的其他字符,那么这些字符必须在输入数据时由用户从键盘原样输入。
例子见书47页例4.4

3.格式符%f与%lf

  1. 调用scanf()输入数据时,通过地址指向变量
    • %f告诉编译器scanf()在该地址存储一个float型数。
    • %lf告诉编译器scanf()在该地址存储一个double型数。
  2. 调用printf()输出数据时
    • 编译器将float参数自动转换为double类型。
    • printf()无法区分floatdouble

4.%c输入字符时存在的问题

#include <stdio.h> 
int main ()
{
    int a;
    char b;
    float c;
    printf ("Please input an integer:");
    scanf ("%d", &a);
    printf ("integer: %d\n", a);
    printf ("Please input a character:");
    scanf ("%c", &b);
    printf ("character:%c\n", b);
    printf ("Please input a float number:");
    scanf ("%f", &c) ;
    printf("float:%f \n", c);
    return 0;
}
//希望得到的结果:
Please input an integer:12
integer: 12
Please input a character:a
character:a
Please input a float number:3.5
float:3.500000 
//实际得到的结果:
Please input an integer:12
integer: 12
Please input a character:character:

Please input a float number:3.5
float:3.500000 

造成这种结果的原因是因为sancf()函数的格式转换符%c表示输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入。所以这里是读取了输入12后的回车键输出了。

解决方法有两种:

//第一种:在scanf()前加入getchar()将回车读走
#include <stdio.h> 
int main ()
{
    int a;
    char b;
    float c;
    printf ("Please input an integer:");
    scanf ("%d", &a);
    printf ("integer: %d\n", a);
    printf ("Please input a character:");
    getchar();
    scanf ("%c", &b);
    printf ("character:%c\n", b);
    printf ("Please input a float number:");
    scanf ("%f", &c) ;
    printf("float:%f \n", c);
    return 0;
}
//程序运行结果:
Please input an integer:12
integer: 12
Please input a character:a
character:a
Please input a float number:3.5
float:3.500000

重要第二种:在scanf(“%c”,&b);这条语句的%c前加入一个空格忽略缓冲区后的空白字符。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用循环语句来实现这个功能。具体步骤如下: 1. 从键盘中读入一个字符; 2. 判断该字符是否为字母a,如果是,则跳出循环,否则继续执行; 3. 将读入的字符输出屏幕上; 4. 回到第一步,继续读入下一个字符。 代码示例: ``` #include <stdio.h> int main() { char ch; while (1) { scanf("%c", &ch); if (ch == 'a') { break; } printf("%c", ch); } return ; } ``` 运行程序后,可以不断输入字符,直到输入字母a时才停止,并将输入的字符原样输出屏幕上。 ### 回答2: 这是一道很基础的编程题目,要求读入字符并原样输出,直到读入字母“a”才停止输出。 解题思路大致如下: 1. 使用循环结构,每次读入一个字符并判断是否为字母“a”,如果是,则跳出循环,结束输入输出过程;如果不是,则继续输出字符。 2. 在读入字符之前,需要先将缓冲区清空,以免出现之前的字符影响读入。 3. 读入字符可以使用C语言中的scanf()函数,输出字符可以使用printf()函数。 实现代码如下: #include<stdio.h> int main(){ char ch; //定义字符变量 while(1){ //使用循环结构 fflush(stdin); //清空缓冲区 scanf("%c",&ch); //读入字符 if(ch=='a') //判断是否为字母“a” break; //跳出循环 printf("%c",ch); //输出字符 } return 0; } 以上代码可以在IDE或在线编译器中运行测试,验证结果是否符合题目要求。 ### 回答3: 这是一个典型的输入输出问题,在程序中需要使用循环语句和条件语句来实现读入一系列字符输出屏幕上,直到输入字母a时停止。 首先定义一个字符数组来存储键盘输入字符,然后使用while循环语句来进行输入输出操作。在循环中,每次读取一个字符并判断是否等于字母a,如果等于则退出循环;否则将该字符输出屏幕上并继续进行下一轮读取和判断,直到读取到字母a为止。 下面是具体实现代码: ```c++ #include <iostream> using namespace std; int main() { char ch[1000]; //定义字符数组存储输入的字符 int i = 0; while (1) //循环读取输入字符 { cin >> ch[i]; //读入一个字符 if (ch[i] == 'a') //判断是否为字母a { break; //如果是则退出循环 } cout << ch[i]; //输出字符 i++; //移动指针到下一个位置 } return 0; //程序结束 } ``` 以上代码定义了一个大小为1000的字符数组ch,使用while循环读取键盘输入字符并进行判断和输出操作,当输入字符为字母a时退出循环并结束程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值