第四章、字符串与格式化输入、输出

4.1字符串

1、字符串是一个或多个字符组成的字符序列,用双引号来表示字符串。

2、C语言中没有专门用来存储字符串的数据类型,而是通过一个字符数组的形式来表示。

3、数组是类型相同的一组数据顺序排列的一种数据存储形式,因此字符串在C语言中就是一组单个字符类型的数据顺序存储形成的数据类型,字符串的末尾有隐藏的结束符'\0',结束符也会占用一个内存单元。

4、字符数组的长度必须大于字符串中字符数量,而且得给结束符预留位置。

5、通常使用strlen()函数来获取字符串内所含字符的数量,此函数不会统计结束符。

4.2常量和变量

1、常量:预先设定的并且在程序中不会修改的数据。

2、变量:在程序运行中会被赋值和修改的数据。

3、常量分类:值常量、符号常量、明示常量。

例如:数值常量:const int num = 12;

数值常量:关键字const表示修饰的变量是只读的,不能被再次赋值。

明示常量:预处理器指令中使用的#define声明的常量。(在编译过程中明示常量会被自动替换为值常量)

#define PI 3.14

程序中所有的PI均会被替换成3.14。

1、编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印。
分析:
读取用户输入的字符串,并且重新格式化输出,应针对名和姓分别定义对应的字符数组,
使用scanf()函数和%s函转换说明符读取数据。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char name[40];
	char surname[40];
	printf("Please input your first name:");
	scanf("%s", &name);
	//读取名字输入,存储至name[]数组中
	//由于scanf的特性,字符串的输入不能有空白
	printf("Please input your last name:");
	scanf("%s", surname);
	//读取姓输入,存储至surname[]数组中
	printf("Hello,%s,%s.", name, surname);
	return 0;
}

运行结果:

Please input your first name:dady
Please input your last name:baby
Hello,dady,baby.
2、编写一个程序,提示用户输入名字,并执行以下操作
打印名字,包括双引号
在宽度为20的字段右端打印名字,并包括双引号
在宽度为20的字段左端打印名字,并包括双引号
在比姓名宽度长3的字段中打印名字
分析:
程序主要用于实现字符串的格式化输出,比姓名宽度长3,需要使用修饰符'*',
且需要获取用户输入的字符串长度
#include<stdio.h>
int main(void)
{
	char name[40];
	int width;
	printf("Please input your name:");
	scanf("%s", name);
	width = printf("\"%s\"\n.", name);
	/*
	使用转义序列打印双引号,并通过printf()函数返回值
	获得名字的字符长度
	*/
	width -= 4;
	/*
	printf()的返回值为打印字符数,因此需要排除两个引号,
	一个换行符,一个句号,或者直接使用
	width=strlen(name);
	*/
	printf("\"%20s\".\n", name);
	//在宽度为20的字段右端打印名字,使用转义序列打印双引号
	printf("\"%-20s\".\n", name);
	//-20表示左对齐
	//在宽度为20的字段左端打印名字,使用转义序列打印双引号
	printf("\"%*s\".", (width + 3), name);
	return 0;
}

运行结果:

Please input your name:nb
"nb"
."                  nb".
"nb                  ".
"   nb".
3、编写一个程序,读取浮点数,首先以小数点计数法打印,
然后以指数计数法打印,用下面的格式输出:
The input is 21.3 or 2.1e+001
The input is +21.290 or 2.129E+001
分析:
程序要求分别使用小数点计数法和指数计数法打印一个浮点型数据,
需要分别使用转换说明符%f和%e,此外,可以添加相应的修饰符进一步格式化
#include<stdio.h>
int main(void)
{
	float input;
	printf("Enter a float number:");
	scanf("%f", &input);
	//读取用户输入的浮点数
	printf("The input is %.lf or %le \n", input, input);
	return 0;
}

运行结果:

Enter a float number:2.1236
The input is 2 or 2.123600e+00
4、编写一个程序,提示用户输入身高(以英寸为单位)和姓名,
然后以下面的格式显示用户刚输入的信息。
Dabney,you are 6.208 feet tall.
使用float类型,并使用"/"作为除号,以米为单位显示出来。
分析:
程序要求用户输入以英寸为单位的身高,进行转化,输出以英尺为单位的身高,
1英尺=12英寸
输入的英寸需要转换成英尺输出,保留小数点后3位有效数字。
#include<stdio.h>
int main(void)
{
	float heigh;
	char name[40];
	printf("Enter your name:");
	scanf("%s", name);
	printf("Hi %s,how tall you are (inch):", name);
	scanf("%f", &heigh);
	printf("%s,you are %.3f feet tall\n", name, heigh/12.0);
	//%.3f表示显示小数点后三位
	return 0;
}

运行结果:

Enter your name:dady
Hi dady,how tall you are (inch):48
dady,you are 4.000 feet tall
5、编写一个程序,提示用户输入以兆位每秒(Mbit/s)为单位的下载速度和
以兆字节(MB)为单位的文件大小。程序中应计算文件下载时间。
注意,这里的1字节=8bit位
使用float类型,并用“/”作为除号。
该程序要以下面的格式打印3个变量(下载速度、文件大小、下载时间)的值,
显示小数点后两位数字。
分析:
程序读取用户输入的下载速度和文件大小,通过计算来估计文件下载时间。
注意,文件大小通常以字节为单位,网络下载速度应以bit/s为单位,
因此单位需要统一。对于浮点型数据,显示小数点后两位数字。
#include<stdio.h>
int main(void)
{
	float speed=0, size = 0, time = 0;
	printf("Please input the net speed:");
	scanf("%f", &speed);
	pritnf("Please input the file size:");
	scanf("%f", &size);
	time = size * 8 / speed;
	printf("At %.2f megabits per second,a file of %.2f megabytes"
    "download in %.2f seconds.", speed, size, time);
	return 0;
}
6、编写一个程序,先提示用户输入名,然后提示用户输入姓。在一行打印用户
输入的名和姓。下一行分别打印名和姓的字母数。字母数要与相应的名和姓结尾对齐。
如下所示:
Melissa Honeybee
	  7        8
接下来打印相同的信息,但是字母与相应名和姓的开头对齐
如下所示:
Melissa Honeybee
7       8
分析:
程序读取用户输入的姓名,并打印姓名中的字符数。为了获取用户姓名中的字符数,可以使用printf()
函数的返回值,也可以使用strlen()函数。字母的对齐用到的字符宽度需要使用'*'号修饰符来通过
参数指定*/
#include<stdio.h>
int main(void)
{
	char name[40], surname[40];
	int wname, wsurname;
	printf("Please input your first name:");
	scanf("%s", name);
	printf("Please input your last name:");
	scanf("%s", surname);
	wname = printf("%s",name);
	printf(" ");
	wsurname= printf("%s", surname);
	//分别打印名和姓,通过返回值记录其字符数量
	printf("\n%*d %*d", wname, wname, wsurname, wsurname);
	//打印名和姓两个字符串后换行,再打印字符个数
	return 0;
}

运行结果:

Please input your first name:dady
Please input your last name:baby
dady baby
   4    4

7、编写一个程序,首先要求用户输入旅行里程和消耗的汽油量,然后计算并显示消耗每加仑汽油
行驶的英里数,显示小数点后的一位数字。接下来,根据1加仑大约等于3.785升,
1英里大约等于1.609千米,把单位是英里/加仑转换为升/100千米,
并显示结果,显示小数点后面的1位数字。
使用#define创建的符号常量或者使用const限定符创建变量来表示两个转换系数。
分析:
程序读取用户输入的行驶里程和消耗的汽油量,然后通过多种计量单位计算油耗,其中需要使用不同
计量单位之间的换算关系,还需要分别使用每100千米油耗和每加仑可行驶的英里数来表示耗油量。
7、编写一个程序,首先要求用户输入旅行里程和消耗的汽油量,然后计算并显示消耗每加仑汽油
行驶的英里数,显示小数点后的一位数字。接下来,根据1加仑大约等于3.785升,
1英里大约等于1.609千米,把单位是英里 / 加仑转换为升 / 100千米,
并显示结果,显示小数点后面的1位数字。
使用#define创建的符号常量或者使用const限定符创建变量来表示两个转换系数。
分析:
程序读取用户输入的行驶里程和消耗的汽油量,然后通过多种计量单位计算油耗,其中需要使用不同
计量单位之间的换算关系,还需要分别使用每100千米油耗和每加仑可行驶的英里数来表示耗油量。
#include <stdio.h>
#define GALLON_TO_LITRE 3.785
#define MILE_TO_KM 1.609
int main(void)
{
    float range, oil;
    printf("Please input the range you traveled(in mile):");
    scanf("%f", &range);
    //以英里为单位读取旅行里程
    printf("please input the oil you spend(in gallon):");
    scanf("%f", &oil);
    //以加仑为单位读取消耗的汽油
    printf("In UAS,your oil wear is %.lf M/G\n", range / oil);
    //打印USA的耗油量
    printf("In Europe,your oil wear is %.lfL/100KM", (oil * GALLON_TO_LITRE * 100) / 
    (range * MILE_TO_KM));
    return 0;
}

 运行结果:

Please input the range you traveled(in mile):12
please input the oil you spend(in gallon):12
In UAS,your oil wear is 1 M/G
In Europe,your oil wear is 235L/100KM

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄金圣手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值