1、程序示例

//talkback.c一个能为你提供一些信息的对话框
#include <stdio.h>
#include <string.h> //提供strlen函数原型
#define DENSITY 62.4 //人的密度(单位是:英镑/每立方英尺
int main()
{
float weight,volume;
int size,letters;
char name[]; //name是一个有40个字符的数组 printf("Hi!What's your first name?\n");
scanf("%s",name);
printf("%s,what's your weight in pounds?\n",name);
scanf("%f",&weight);
size = sizeof name;
letters = strlen(name);
volume = weight/DENSITY;
printf("Well,%s,your volume is %2.2f cubic feet.\n",name,volume);
printf("Also ,your first name has %d letters,\n",letters);
printf("and we have %d bytes to store it in .\n",size);
return ;
}

上述程序的新特性:

  • 使用一个数组(array)来存放一个字符串,该数组是内存中一串连续的40个字节,其中每个字节都存放一个字符值。
  • 使用%s转换说明符,来处理字符串的输入和输出。注意,在scanf()中,weight用了&前缀,而name没有用。
  • 使用C的预处理器定义代表值62.4的符号常量DENSITY。
  • 使用C函数strlen()来获取字符串的长度

2、字符串简介

  字符串(character string )---就是一个或多个字符的序列。如"Zing went the strings of my heart!",双引号不是字符串的一部分,只是通知编译器其中包含了一个字符串,正如单引号标识着一个字符一样。

  2.1、char数组类型和空字符串

    C没有为字符串定义专门的变量类型,而是把它存储在char数组中。字符串的字符存放在相邻的内存中,每个字符占据一个单元;而数组由相邻存储单元组成。

  如下图

  

  数组的最后一个位置显示字符\0,这个字符就是空字符,C用空字符来标记字符串的结束,空字符不是0,它是非打印字符,他的ASCII值的确为0,所以该字符的存在意味着数组单元必须至少比要存储的字符数多1.

  2.2 什么是数组

    数组---就是同一类型的数据元素的有序序列。

    char name[40] ; 此声明创建了一个有40个存储单元的数组,其中每一个单元存储一个char 类型的值。

  

  2.3、使用字符串

  如下程序:

  

/*praise.c使用不同类别的字符串*/
#include <stdio.h>
#define PRAISE "What a super marvelous name!" int main(void)
{
char name[40];
printf("Whar is your name?\n");
scanf("%s",name);
printf("Hello %s.%s\n",name,PRAISE);
return 0;
}

  

结果如上图,无需将空字符插入到数组中,scanf()在读取输入时会替我们完成这项任务。

注意:scanf()只读取了Ivan fu的名字Ivan,scanf()开始读取输入后,会遇到一个空白字符空格(blank)、制表符(tab)或者换行符(newline)处停止读取。一般情况下,使用%s()只会把一个单词而不是一个完整的句子作为字符串输入,C使用了其他读取输入函数(如get是())来处理一般的字符串。

  2.4、区别字符和字符串

  字符--'x';

  字符串--"x"

  2.5、strlen()函数

   上一章出现的sizeof运算符,它的作用是以字节为单位给出数据大小。strlen()以字符为单位给出字符串的单位。因为一个字符只占用一个字节,但是却不能把2个函数运用到同一个字符串得到相同的结果。

如下列程序,给出详细解释。

/*praise.c使用不同类别的字符串*/
#include <stdio.h>
#define PRAISE "What a super marvelous name!" int main(void)
{
char name[40];
printf("Whar is your name?\n");
scanf("%s",name);
printf("Hello %s.%s\n",name,PRAISE);
printf("Your name of %d letters occupies %d memory cells.\n",strlen(name),sizeof name);
printf("The phrase of praise has %d letters",strlen(PRAISE));
printf("and occupies %d memory cells.\n",sizeof PRAISE);
return 0;
}

由结果可知道,根据sizeof 运算符的报告,数组name有40个内存单元。但是只用了4个单元来存储Ivan,这是strlen()报告的。数组的第五个单元放置空字符串,它的存在告诉strlen()在哪里停止计数。对于PRAISE,strlen()再一次给出了字符串中字符的准确数目,sizeof运算符提供的数目总是比前者大1,这是因为它把从来标志字符串结束的不可见的空字符也计算在内。您并没有告诉计算机为存储该语句分配多大内存,它必须自己计算处双引号之间的字符的数目。

3、常量和C预处理器

  在我们程序中,有些数据有可能固定不变,因此我们就用常量来标识。

  例如π这个数,如果每次都要写,一更改会造成混乱,因此用符号常量来解决这个麻烦。

  3.1、C中,预处理器用#define来定义常量,注意这里没有“=”符号,常量符号一般用大写表示。

  例如:#define  Pi  3.14159

  3.2、const修饰符--常量的第二种定义方法。

    const int MONTH = 12;

4、研究printf()和scanf()函数

  printf()和scanf()函数时我们能够与程序通信。它们被称为输入输出函数,或者I/O函数。下面我们介绍这两个函数的工作原理。

  4.1printf()函数

  请求printf()打印变量的指令取决于变量的类型。%d、%s这些符号被称为转换符,它们指定了如何把数据转换成可显示的形式。如下表

  

  printf()的使用格式

    printf(Control-string,item,item1...);

     item、item1等等都是要打印的项目,可以是变量,也可以是常量。

     控制字符串是一个描述该项目的如何打印的字符串,控制字符串应该为每个要打印的项目包含一个转换说明符。下图解释了格式原理

  

  4.2、scanf()函数

  使用scanf()函数的简单规则:

  • 如果使用scanf()来读取基本变量类型的值,在变量名前家加一个&(取地址符)
  • 如果使用scanf()把一个字符串读取到一个字符数组中,不要使用&  

  

// input.c -- when to use &
#include <stdio.h>
int main(void)
{
int age; // variable
float assets; // variable
char pet[30]; // string printf("Enter your age, assets, and favorite pet.\n");
scanf("%d %f", &age, &assets); // use the & here
scanf("%s", pet); // no & for char array
printf("%d $%.2f %s\n", age, assets, pet); return 0;
}

  

重学C语言---04字符串和格式化输入/输出的更多相关文章

  1. 【C语言学习】《C Primer Plus》第4章 字符串和格式化输入/输出

    学习总结 1.String str=”hello world!”;(Java),char[20]=” hello world!”;(C).其实Java字符串的实现,也是字符数组. 2.字符串的尾部都会 ...

  2. C Primer Plus学习笔记(三)- 字符串和格式化输入/输出

    从一个简单的例子开始 #include <stdio.h> int main() { char name[10]; printf("Input Your Name:\n" ...

  3. C Primer Plus 第4章 字符串和格式化输入/输出 编程练习

    1. #include <stdio.h> int main(void) { ]; ]; printf("请输入您的名字: "); scanf("%s&quo ...

  4. 重学C语言

    重学C语言 #include <stdio.h> int main() { ; ; printf("I am %d year old.\n",age); printf( ...

  5. Java字符串的格式化与输出

    Java字符串的格式化与输出 在C语言中格式化输出能够通过printf()函数实现,在Java中无需借助第三方工具相同能够实现此功能.自Java SE5后,java也提供了C语言中printf()风格 ...

  6. 重学C语言---01概述

    1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...

  7. c语言之字符串和格式化输入输出

    字符串和格式化输入输出 #include<stdio.h> #include<string.h> #define DENSITY 62.4 int main(void) { f ...

  8. C语言中字符串的格式化

    本文整理转载自:http://wenku.baidu.com/view/065d62fff705cc1755270989.html C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度 ...

  9. 重学C语言 -- printf,scanf

     printf();    用来显示格式串的内容          注意: 参数不可以换行,否则会出一个警告.       格式串中占位符比表达式数量多     会显示一个无意义值 格式串中占位符比表 ...

随机推荐

  1. 【beta】阶段 第七次 Scrum Meeting

    每日任务 1.本次会议为第七次 Meeting会议: 2.本次会议在下午14:45,课间休息时间在陆大楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work item ...

  2. 【Alpha阶段】第五次scrum meeting

    一.会议照片 二.会议内容 姓名 学号 负责模块 昨日任务完成度 今日任务 杨爱清 099 界面设计和交互功能 完成 去酷狗选择合适的轻音乐 杨立鑫 100 数据库搭建和其他 完成 继续对数据库进行编 ...

  3. 201521123080《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下 分析: ...

  4. [BT5]信息收集1-1 Dnsenum

    0.工具介绍 The purpose of Dnsenum is to gather as much information as possible about a domain. The progr ...

  5. js中判断undefined类型

    typeof 运算符返回一个用来表示表达式的数据类型的字符串.可能的字符串有:"number"."string"."boolean".&qu ...

  6. SpringMVC的数据格式化-注解驱动的属性格式化

    一.什么是注解驱动的属性格式化? --在bean的属性中设置,SpringMVC处理 方法参数绑定数据.模型数据输出时自动通过注解应用格式化的功能. 二.注解类型 1.DateTimeFormat @ ...

  7. python generator(生成器)

    a=(x*2 for x in range(1000)) # print(a.next())#python2使用 print(a.__next__()) #python3使用 print(next(a ...

  8. RabbitMQ消息队列之二:消费者和生产者

    在使用RabbitMQ之前,需要了解RabbitMQ的工作原理. RabbitMQ的工作原理 RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根 ...

  9. 【Conclusion】MySQL使用

    MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...

  10. AngularJS 1.3中的一次性数据绑定(one-time bindings)

    点击查看AngularJS系列目录 谈谈AngularJS 1.3中的一次性数据绑定(one-time bindings) 不久之前,AngularJS 1.3版本正式发布,其中添加了很多的性特性,同 ...