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. Mac/Windows开发跨平台.NET Core 控制台程序

    自从微软开始在Github上开源搞.NET Core后,.NET的跨平台逐渐就成真了.多年使用各种语言,说实话还是csharp用起来最舒服.不过现在的工作环境里使用它的机会比较少,大部分时候只是用来写 ...

  2. 201521123002 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  3. 201521123093 java 第二周学习总结

    201521123093 <java程序设计> 第二周学习总结 一.第二周学习总结 答:(1)关于进一步使用码云管理代码,本周才真正学会了如何将Eclipse里的代码上传到码云中,并且能够 ...

  4. ZIP格式

    总体格式 分文件头+文件压缩数据 中心目录+中心目录记录结束符 1.分文件头信息 0X 50 4b 03 04 分文件头信息标志,一般是zip文件的开头,可以通过这个判断文件格式 14 00 解压缩所 ...

  5. 201521123018 《Java程序设计》第10周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 2. 书面作业 一.inally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答: 4-2中 ...

  6. 关于Java中数组的常用操作方法

    1. 声明一个数组 String[] arr1 = new String[5]; String[] arr2 = {"a","b","c", ...

  7. Oracle-更新字段-一张表的字段更新另一张的表的字段

    设备表ops_device_info中的终端号terminal_id值是以 'D'开头的字符串,而终端表ops__terminal_info中的终端号terminal_id是8位字符串, 它们之间是通 ...

  8. mapreduce自定义排序(map端1.4步)

    3 3 3 2 3 1 2 2 2 1 1 1 -----------------期望输出 1 1 2 1 2 2 3 1 3 2 3 3 将以上数据进行排序,排序规则是:按照第一列升序排序,如果第一 ...

  9. Spring在JSP页面使用ServletContext

    在 JSP 页面使用Application 可以 看到使用的是WebApplicationContextUtils 而不是WebApplicationContext.ROOT_WEB_APPLICAT ...

  10. getOutputStream() has already been called for this response

    错误日志里偶尔会有getOutputStream() has already been called for this response这个错误 最近发现了高概率复现条件,所以顺手解决了一下: 首先根 ...