声明:我写这一系列文章在讲述过程中可能用了一些大白话,也可能有的地方墨迹了一些,但旨在把一些没有基础但很想学软件开发的一些人领进门来,另外该文章我同时也在百度经验发表。
以前我们学习中只重点使用了整型数据、浮点数据和字符数据,今天我们介绍另一种数据字符串,从名字上你就可以知道字符串是由若干个字符串联起来组成的,在c语言里字符串要用双引号引上例如 "abc" "23#sdf" "你好" 都是字符串。
其实下面这段代码在逻辑上没什么意义,但你在编译器上运行不会报错,这说明字符串是c语言可以处理的一种数据类型。
int main()
{
"abc123";
}
如果我们把 "abc123"看成是一个密码,那我们需要把它先存起来,用什么存呢?整数用int型变量来存,浮点数用float型变量来存,字符用char型变量来存,但c语言里没有字符串型,所以我们还得把字符串分解,因为字符串是由若干个字符组成的所以我们用字符数组来存储字符串里的每个字符。
现在我们把 "abc123" 存起来
char a[6];
a[0]='a';
a[1]='b';
a[2]='c';
a[3]='1';
a[4]='2';
a[5]='3';
上面这种写法实在是太麻烦了,所以c语言提供了一种给数组初始化的简单形式,这里所说的初始化就是在定义的时候就给数组里的元素赋上初始的值。
char a[6]={'a','b','c','1','2','3'};
这是一种通用的给数组初始化的方法,其它类型数组也同样适用,例如
int a[3]={1,3,56}; float a[5]={1.4,3.45,4546,78.9,0}
记住定义和赋初始值一定是写在一起才表示初始化,绝不代表数组里的变量能一起操作,例如下面的写法就是错误的;
int a[3];
a={1,2,56};//这里不是初始化,因为a数组已经定义完了,c语言环境会认为这是一个赋值运算,你能给a[0]、a[1]和a[2]赋值但确不能给a赋值,数组里的元素不能一起操作因为他们是三个变量。
特殊的在c语言里支持直接使用字符串初始化。
char a[7]= "abc123";
这种初始化方式,数组的长度要多一位,因为系统默认会在字符串的尾巴上加上一个结束符'\0',多出的一位就是存储这个结束符号的,这个结束符的作用就是用来标识字符串的结尾,一会我们讲的puts函数就使用了这个结束符。这里再强调一遍下面这样写是错误的。
char a[7];
a= "abc123"; //这里不是初始化
数组的初始化我们就先讲到这里。上节结尾我们讲到了可以利用循环来给数组里的元素从键盘赋值当然也可以利用循环输出数组里的每个元素,为了输入输出方便不用每次都写循环我们可以利用gets函数来从键盘读入字符串,利用puts向屏幕输出字符串,请看下面的代码
int main()
{
char a[100];
printf("请输入密码:");
gets(a);//利用gets把从键盘输入的字符串里的每个字符都存放到a数组里并在最后存储一个结束符'\0'
printf("你输入的密码是:");
puts(a);//利用puts把a数组里的每个字符都输出到屏幕上
}
因为我们不知道用户输入多少个字符,又因为那个黑色窗口一行最多也不会超过100个,所以把数组长度定义为100足够了
gets和puts函数的用法很简单,你只需要在小括号里写数组的名字即可。
puts函数是一个一个字符输出遇到结尾标识'\0'就停止输出,例如运行下面的代码你会发现并没有输出@
int main()
{
char a[100]="abc";
a[5]='@';
puts(a);
}
我们可以利用字符串中的'\0'来统计有效字符个数例如
int main()
{
char a[100];
int i=0;//数组下标
printf("输入一个字符串:");
gets(a);
while(a[i]!='\0')
{
i=i+1;
}
printf("你输入的字符串中有%d个字符\n",i);
}
解析:挨个访问数组里的字符,如果是'\0'则退出循环,此时i的值是'\0'的下标也正好是数组里有效字符的个数。
留个练习你能完成吗?
int main()
{
char p[7]="abc123"; //正确的密码已经存放在p里
char a[100];//用来存储用户从键盘输入的密码
printf("请输入密码:");
gets(a);
/*------------
在这里加一些代码,能够判断用户输入的密码是否正确
-------------*/
}