1、一维字符数组:
一维字符组用于存放字符型数据,其定义、初始化、引用与其它类型的一维数组一样。
例如:char str[80] //定义一个有80个字符型元素的数组str
例1:char t[5] = {'H','A','P','P','Y'}; //初始化数组t
例2:static char s[6] = {'H','A','P','P','Y'}; //对static静态数组前5个元素赋初值,其余元素为0
注:整数0代表字符'\0',即ASCII码为0的字符。
数据初始化时,如果对所有元素赋了初值,就可以省略数组长度。
字符组数组的输出也用for循环来进行。
2、字符串:
字符串常量就是用一对双引号括起来的字符序列,即一串字符。
!!!它的结束标志为'\0','\0'是字符串结束符!!!
例如:字符串”Happy“由6个字符组成,分别是:'H'、'a'、'p'、'p'、'y'和'\0'。
static char s[6] = {'H','a','p','p','y','\0'}; 等价于:static char s[6] = "Happy";
字符串的有效长度就是有效字符的长度,即上述字符串有效长度为5。
字符串长度由有效字符和字符串结束符'\0'组成。
1)字符串的存储——数据的初始化:
如上。
将字符串存储入字符型数组时,由于有字符串结束符'\0',数组长度至少是字符串的有效长度+1,
即字符串只占用了数组的一部分。
2)字符串的操作:
与普通字符数组的区别:由于字符串存在字符串结束符'\0',所以:
普通字符串数组的循环结束标志:很明确,为数组个数。
字符串循环的结束标志:等于'\0',一般通过比较是否等于'\0'来决定是否结束循环。
3)字符串的存储——赋值与输入:
将字符串存入数组,还可以采用赋值和输入的方法。
例如:static char s[80]; s[0] = 'a'; s[1] = '\0';
等价于:static char s[80] = "a";
!!!注意:'a'是字符常量,只有一个字符,可以赋值给字符变量。
!!!注意:"a"是字符串常量,包括两个字符'a'和'\0',用于一维字符数组存放。
例1:判断回文字符串。输入一个以回车符为结束标志的字符串(至少80个字符),判断该字符是否为回文。回文就是字符串中心对称,如:”noon“、”radar“、是回文,”reader“不是回文。
代码如下:
#include <stdio.h>
#define MAXLINE 80
int main(void)
{
int i,k = 0,op;
int a[MAXLINE];
//以下为输入字符
while((a[k] = getchar()) != '\n'){
k++;
}
a[k] = '\0';
//输入完毕
//以下为从两端分别向中间比较是否字符相等的代码
i = 0;
k = k - 1;
while(i < k){
//不等的情况直接跳出循环
if(a[i] != a[k]){
break;
}
i++;
k--;
}
if(i >= k){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}
比较:判断回文数。输入任意正整数,判断该数是否为回文数,所谓回文数就是从左到右读这个数与从右到左读这个数是一样的。例如12321、1221都是回文数。
代码如下:
#include <stdio.h>
int main(void)
{
int num,numm,sum,a,c,b;
scanf("%d",&num);
sum = 0;
numm = num;
while(numm != 0){
b = numm % 10;
numm = numm / 10;
sum = 10 * sum + b;
}
if(sum == num){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}
3、使用字符串编程:
例2:凯撒密码。输入一个以回车符为结束标志的字符串(少于80个字符),再通过一个正整数
offset,用凯撒密码将其加密后输出。凯撒密码是指将明文中的所有字母都在字母表上向后偏移
offset后被替换成密文。由于字符串少于80个字符,数组长度就取其上限80,以回车符'\n'作为
输入结束符。
代码如下:
#include <stdio.h>
#define MAXLINE 80
int main(void)
{
int i = 0,offset;
//以下为定义字符型数组
char str[MAXLINE];
//定义完毕
char ch;
//以下为输入字符串进入数组
while((ch = getchar()) != '\n'){
str[i] = ch;
i++;
}
//以下还要输入字符串结束符
str[i] = '\0';
//输入完毕
//以下为输入字符偏移量
scanf("%d",&offset);
if(offset > 26){
offset = offset % 26;
}
//输入完毕
//以下为对数组中的字符串进行加密处理
for(i = 0;str[i] != '\0';i++){
//1、对小写字母进行处理
if(str[i] > 'a' && str[i] < 'z'){
//考虑是否越位的情况
if('z' - str[i] > offset){
str[i] = str[i] + offset;
}else{
str[i] = 'a' + offset - 'z' + str[i];
}
}
//2、对大写字母进行处理,类比如上
if(str[i] > 'A' && str[i] < 'Z'){
//考虑是否越位的情况
if('Z' - str[i] > offset){
str[i] = str[i] + offset;
}else{
str[i] = 'A' + offset - 'Z' + str[i];
}
}
}
//处理完毕!
//以下对数组进行输出
for(i = 0;str[i] != '\0';i++){
printf("%c",str[i]);
}
printf("\n");
//输出完毕!
return 0;
}
从中获得的启示:
字符串类数组一般为for循环一般用判断是否等于换行符'\n'来判断循环是否结束。
比较OJ系统练习:本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,
需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表
中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。
非数组代码编程如下:
#include <stdio.h>
int main(void)
{
int i = 0;
char ch;
while((ch = getchar()) != '\n'){
if(ch >= 'a' && ch < 'z'){
ch = ch + 1 - 'a' + 'A';
}else if(ch >= 'A' && ch < 'Z'){
ch = ch + 1 - 'A' + 'a';
}else if(ch == 'z'){
ch = 'A';
}else if(ch == 'Z'){
ch = 'a';
}else{
}
printf("%c",ch);
i++;
}
return 0;
}
数组代码编程如下:
#include <stdio.h>
#define MAXLINE 100
int main(void)
{
char ch;
char str[MAXLINE];
int i = 0;
while((ch = getchar()) != '\n'){
str[i] = ch;
i++;
}
str[i] = '\0';
for(i = 0;str[i] != '\n';i++){
if(str[i] >= 'a' && str[i] < 'z'){
str[i] = str[i] + 1 - 'a' + 'A';
}else if(str[i] == 'z'){
str[i] = 'A';
}else if(str[i] >= 'A' && str[i] < 'Z'){
str[i] = str[i] + 1 - 'A' + 'a';
}else if(str[i] == 'Z'){
str[i] = 'a';
}else{
}
}
for(i = 0;str[i] != '\0';i++){
printf("%c",str[i]);
}
printf("\n");
return 0;
}
从中的启示:
!!!记得输入换行符'\n'!!!
!!!字符与数字之间的转换!!!
例3:字符转换。输入一个以回车符为结束标志的字符串(少于10个字符),提取其中的所有字符
('0',……,'9'),将其转换为一个十进制整数输出。由于字符串少于10个字符,数组长度就取其上限10,以回车符'\n'作为输入结束符。
代码如下:
#include <stdio.h>
#define MAXLINE 10
int main(void)
{
char str[MAXLINE];
char ch;
int i = 0,number = 0;
//以下为输入
while((ch = getchar()) != '\n'){
str[i] = ch;
i++;
}
str[i] = '\0';
//输入完毕
//以下对数字进行提取
for(i = 0;str[i] != '\0';i++){
if(str[i] >= '0' && str[i] <= '9'){
//以下进行数字组合
number = number * 10 + str[i] - '0';
}
}
//处理完毕
printf("%d",number);
return 0;
}
!!!进制之间的转换!!!
例4:十六进制字符串转换成十进制非负整数。输入一个以'#'为结束标志的字符串(少于10个字符),滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,输入该字符串并将其转换为十进制数后输出。表示十六进制数字的字符为数字字 符'0'、'1'、'2'、……、'9',大写英文字母'A'、'B'、'C'、'E'、'F'以及小写英文字母'a'、'b'、'c'、'd'、'e'、'f'。将十六进制字hexad[i]转换成十进制数number的表达式如下:
number = number * 16 + hexad[i] - '0'
number = number * 16 + hexad[i] - 'A' + 10
number = number * 16 + hexad[i] - 'a' + 10
代码如下;
#include <stdio.h>
#define MAXLINE 10
int main(void)
{
char ch;
char str1[MAXLINE];//原始数组
char str2[MAXLINE];//处理后数组
int i = 0,number = 0,j = 0;
//以下为输入
while((ch = getchar()) != '#'){
str1[i] = ch;
i++;
}
str1[i] = '\0';
//输入完毕
//以下为筛选十六进制字符串
for(i = 0;str1[i] != '\0';i++){
if((str1[i]>='0'&&str1[i]<='9')||(str1[i]>='A'&&str1[i]<='F')||(str1[i]>='a'&&str1[i]<='f')){
str2[j] = str1[i];
j++;
}
}
str2[j] = '\0';
//筛选完毕
//以下对筛选后的数组元素进行输出
for(i = 0;str2[i] != '\0';i++){
printf("%c",str2[i]);
}
printf("\n");
//输出完毕
//以下对十六进制字符转换为十进制整数
for(i = 0;str2[i] != 0;i++){
if(str2[i]>='0'&&str2[i]<='9'){
number = number * 16 + str2[i] - '0';
}else if(str2[i]>='a'&&str2[i]<='f'){
number = number * 16 + str2[i] - 'a' + 10;
}else if(str2[i]>='A'&&str2[i]<='F'){
number = number * 16 + str2[i] - 'A' + 10;
}
}
//转换完毕
//以下进行输出
printf("%d",number);
//输出完毕
return 0;
}
代码运行如下:
本章节数组全部学习完毕!