字符数组知识小结
字符数组的定义和引用
1. 定义格式 char 数组名[数组元素] 【={元素初值列表}】如char a[8]={‘G’,‘o’,‘o’,‘d’}初始化时数组元素小于定义数,则后面自动补ASCLL为0的’\0’初始化元素不能大于定义数否则会出错
2. 可以去掉定义时的元素数直接定义char a[ ]={‘i’,‘l’,‘i’,‘k’,‘e’}数组长度为5,后面不会加字符串结束符’\0’也可以用以下方式定义char x[ ]={“I am a student .”;} char x[ ]=“I am a student .”;
3. 字符数组的引用 数组名[下标]
4. 字符串常量和字符数组 字符串通常整体处理,字符数组中如果没有字符串结束符’\0’,不能当作字符串使用,否则可能出错;字符数组可以用来存放字符串常量,此时数组的元素个数应大于或等于字符串的长度加一。
字符数组的输入输出
- 可以用%c逐个字符输入到字符数组,然后输出
- 可以用格式串%s指定格式,由于字符数组的首地址与第一个元素地址一致,故可以直接用数组名做输入项整体输入字符串。由于是整体输入,所以在字符串末尾系统自动加上’\0’。当遇到” 空格“ “\t” ," \n",“enter键”,字符数组会自动结束;当遇到带空格的字符串时,可以用gets()函数处理。字符串的输出:数组长度大于字符串长度,遇到第一个’\0’结束。如果没有’\0’用"%s"格式输出数组时会内存中该数组的内容一并输出,知道遇到’\0’结束。此时最好用%c格式输出。
字符串处理函数
- puts(字符串) 将字符串输出到终端
- gets(字符数组) 输入一行字符序列到字符数组,返回数组首地址
- strcat(字符数组,字符串) 将字符串连接到数组中的串后面,返回数组首地址
- strcmp(字符串1,字符串2) 两个字符串比较,返回比较结果(逐个进行ASCLL值的比较,s1>s2,返回争执,s1=s2,返回0,s1<s2,返回负值)
- strcpy(字符数组,字符串) 复制字符串到字符数组,返回字符数组首地址
- strlen(字符串) 测字符串长度,返回字符串长度。
- strwr(字符串) 将字符串大写字母转换成小写,返回该串首地址。
- strpr(字符串) 将字符串小写字母转换成大写,返回该串首地址。
字符串函数的应用
#include<stdio.h>
#include<string.h>
int main(void)
{
char s1[20]="abcde",s2[10]="123456";
puts(strcat(s1,s2));
printf("%d %d\n",strlen(s1),strcmp(s1,s2));
gets(s1);
printf("%d %d\n",strlen(s1),strcmp(s1,s2));
puts(strcpy(s1,s2));
printf("%d %d\n",strlen(s1),strcmp(s1,s2));
gets(s1);
puts(strcat(s1,s2));
}
输出:
abcde123456
11 1
wxyz
4 1
123456
6 0
ab
ab123456
--------------------------------
Process exited after 38.77 seconds with return value 0
请按任意键继续. . .
特大整数的精确相加
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[101],b[101];
int i,j,k,m,n;
scanf("%s",a);
scanf("%s",b);
m=strlen(a);
k=n=strlen(b);
if(m>k) k=m; //k是两个字符串长度的最大值
for(i=0;i<k;i++)
a[k-i]=a[m-i-1]; //使数组a的字符串a[k]右对齐
for(i=0;i<=k-m;i++)
a[i]='0'; //使数组a最高位补零
for(i=0;i<=k;i++)
b[k-i]=b[n-i-1]; //使数组b的字符串以b[k]右对齐
for(i=0;i<=k-n;i++)
b[i]='0'; //使数组b的高位补0
j=0;
for(i=0;i<k;i++)
{
j=a[k-i]+b[k-i]+j-96; //字符转换为整数相加,再加低进位,赋给j
a[k-i]=j%10+48; //j整除10的余数转化为字符
j=j/10; //j整除10的商,作为本位的进位数
}
if(a[0]=='0')
printf("%s\n",a+1);
else printf("%s\n",a);
}