C语言学习2之字符串及输入输出

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言学习2
字符串及输出和输入
2.1:不像我们之前学到的整型,浮点型等数据那样,C没有为字符串定义专门的变量类型,一般情况下将字符串放在字符数组中。

下面我们看下段字符串在数组中存放的方式:
“hello hi!”
需要注意“\0”不是真正意义上字符串的一部分,它的作用是告诉电脑字符串在此处结束。

但它也占用一个字节。

下面我们用程序2.1来验证“\0”是否占用空间。

/*
函数名:main
输入参数:无
输出参数:无
调用:printf(), strlen()
被调用:无
功能:验证字符串中“\0”是否占空间
*/
#include <stdio.h>
#include <string.h>
#define PRAISE "one name"//宏定义一个字符串
void main(void)
{
printf("the strlen(s_name) =%d\n",strlen(PRAISE));
printf("the sizeof(s_name) =%d\n",sizeof(PRAISE));
}
程序2.1
程序2.1运行的结果如图2-1所示:
图2-1:程序2.3运行结果
Strlen()求的是字符串中字符的个数“\0”是不属于字符串的一部分的,所以strlen(s_name)=8;sizeof求的是字符串所占数据的大小,“\0”也包括在内的,所以sizeof(s_name) =9。

也就是说字符串存放在数组中时,会在字符串的末尾加一个“\0”来指示字符串的结束。

给一个字符型数组赋值如下:
Char c_name[10] = “ding you wei”;
当我们需要知道一段字符串中有多少的字符时可以使用strlen()函数来实现。

下面我们来看程序2.2:
/*
函数名:main
输入参数:无
输出参数:无
调用:printf()
被调用:无
功能:求取字符串中字符的个数
*/
#include <stdio.h>
#include <string.h>
char c_name[3] ;
float f_richer ;
void main(void)
{
#define Q "hei is me."
char s_name[30] ="ding you wei";
printf("the num of Q is:%d\n",strlen(Q));
printf("the num of s_name is:%d\n",strlen(s_name));
}
程序2.2
对于上面的程序我们要注意两点:1,由于strlen()是C库中的函数,所以我们要在文件的开头包含string.h文件。

要注意strlen()与sizeof的区别,strlen()是函数,它求的是一个字符串中或字符串数组中字符的个数,例如printf("the num of s_name
is:%d\n",strlen("we"))。

而size0f()只是一个关键字,它是用来求某一数据类型所占的字节数的;2.我们可以通过宏定义的方式来定义一段字
符串。

其实我们还可以有另一个方法来定义一个字符串变量:const char Q_word[20] ="hei is me."
下面我们来具体比较下strlen()和sizeof的区别,看程序2.3:/*
函数名:main
输入参数:无
输出参数:无
调用:printf(), strlen()
被调用:无
功能:比较sizeof()与strlen()的区别
*/
#include <stdio.h>
#include <string.h>
char c_name[3] ;
float f_richer ;
void main(void)
{
char s_name[20] = "ding you wei";
printf("the sizeof(s_name)=%d\n",sizeof(s_name));
printf("the strlen(s_name)=%d\n",strlen(s_name));
}
程序2.3
程序运行的结果如图2-2所示:
图2-2:程序2.3运行结果
从程序运行的结果我们可以看出sizeof()求的是数组的大小,因为我们定义的是包含20个字符元素的数组,而一个字符的大小为1个字节,所以该数组的大小为20;strlen()求的是该数组中字符串所包含的字符的个数(包括空格),所以其大小为12.
2.2:printf()的使用
Printf()的使用格式一般是printf(“…”,num1,num2)。

双引号里面包括需要原样打印的字符串及对后面参数格式说明的格式符。

有些时候我们还需要对格式符进一步的进行规定。

表1列出了一些修饰符。

五种标志的具体具体作用如表2所示:
下面我们具体来看下printf()的工作流程。

现有下面语句
float n1 =3.0
double n2 =3.0
long n3 =2000000000
long n4 =1234567890
Printf(“%ld %ld %ld %ld\n”,n1,n2,n3,n4,);
首先计算机根据变量n1,n2,n3,n4把这些值放到堆栈中,所以,n1占8个字节(float被转换为double),n2也占8个字节;n3和n4分别占用4个字节。

然后,printf()根据转换说明来读取堆栈中的值。

%ld说明printf()读取4字节的数据,而第一个数据应该是8个字节,所以printf()只读取了n1数据的一般,这样打印的数据便会出错。


对于一些较长的字符串,我们有三种打印的方法:
1:采用多个printf()
2:用反斜杠和回车的方式。

例如:
printf(“anotherway to your \
home.\n”)
3.采样字符串连接的方法。

例如:
printf(“anotherway to ””your home.\n”)
即在一个双引号引起来的字符串后面跟另一个双引号引起来的字符串,且两者之间这有空白符,那么C会把他们组成一个字符串。

2.3:scanf()的使用
scanf()使用与printf()相似:
scanf(“说明符”,&变量)
&变量表示是变量的地址,当然如果变量时数组的话,那么前面就不需要加“&”,因为数组的名字就代表它的首地址。

scanf()的转换符与printf()很相似,主要区别是printf ()将%e、%f用于double类型,而scanf()将%e、%f用于float 型,将%le、%lf用于double型。

表3列出scanf()的主要转换说明符。

表3:scanf()转换说明符
表4列出了scanf()的转换修饰符
表4:scanf()修饰符
下面我们具体来看看scanf()的工作流程:
假定你用了一个%d说明符来读取一个整数。

Scanf()函数开始每次读取一个输入字符,他跳过空白字符(空格、制表符、换行),知道遇到第一个非空白字符。

由于是读入整数,所以scanf()只有读到数字或正负号才行,如果读到的是其他的非空白字符,那么scanf()会停止读取。

如果他发现一个数字或正负号,那么将其保存,并继续往下读,直到读到一个非数字的字符或读到指定的字宽。

scanf()将遇到的非数字的字符放回输入。

这就意味着下次读取时,scanf()会从这个非数字的字符开始读。

如果你用了一个%d说明符来读取一个整数,可是Scanf()函数读到的第一个非空白字符却不是数字或正负号,比如是“A”,那么Scanf()
将停止读取,并“A”放回输入,下次读取时从“A”处开始。

如果程序只有%d说明符,那么Scanf()永远也跳不过“A”(去都下个字符)。

其他的说明符跟%d相似,主要区别是%x能识别a、b、c、d、e、f.%f能识别小数点,%s能识别空格以外的所有字符。

Scanf()允许把普通字符放在格式字符串中。

除了空格字符之外的普通字符要与输入字符串完全匹配。

看程序2.4
/*
函数名:main
输入参数:无
输出参数:无
调用函数:scanf() printf()
被调用:无
功能:在scanf()的格式字符串中加入普通字符
*/
#include <stdio.h>
void main(void)
{
int i_num =0;
float f_num = 0.0f;
scanf("%d,%f",&i_num,&f_num);
printf("i_num=%d f_num=%.1f\n",i_num,f_num);
程序2.4
那么在输入数字是应该按下面的方式:
3,1.3 或3, ______1.3 或______3,1.3(_表示空格) 不能像这样:3 ,1.3
原因是scanf()第一个要读的是整数,我们先输入3,满足条件。

下一个必须输入逗号,如果你输入的是空格,那么scanf()完成对%d 的读取,下一个读取的应该是%f,也就是说只有读到数字、符号或小数点才可以,可是读到的却是逗号,scanf()会因此而停止读取。

f_num 也就不会被赋值。

Printf()和scanf的*修饰符。

有些时候我们不想事先规定好打印字符的字宽,而是希望在程序运行过程中来决定打印字符的字宽。

那么您可以用*来替代表示字宽的数字,下面我们来看程序2.5:
/*
函数名:main
输入参数:无
输出参数:无
调用函数:scanf() printf()
被调用:无
功能:用*来指定打印字符的字宽
*/
#include <stdio.h>
void main(void)
{
int i_num =0;
/*i_width、i_precision分别用来指示输出字符的字宽及精度*/
int i_width =0;
int i_precision =0;
float f_num = 0.0;
printf("\aplease enter a float number:");
scanf("%f",&f_num);
printf("\n");
printf("\aplease enter two numbers to ensure the width and precision:");
scanf("%d %d",&i_width,&i_precision);
printf("\nend is %*.*f\n",i_width,i_precision,f_num);
}
分析上面的程序可以看出,刚开始时并没有指定输出变量f_num 的宽度和精度,而是在程序运行中会通过scanf()来指定变量f_num 的宽度和精度。

对于scanf(),*放在%与说明符之间,它使函数跳过对该数的输入。

例如:
scanf(“%*d %d”,&i_num1, &i_num2);
当你输入两个数时,上述语句只读取第二个数放进i_num2中。

才疏学浅,还望指教。

欢迎大家加入单片机与C语言交流群:325011683。

相关文档
最新文档