1. 数组特性:
- 是一种构造数据类型、复合数据类型
- 目的是可以批量处理同一类型数据
- 之所以可以批量处理,是因为采用了连续存储的机制
- 这样就可以通过数组名[下标]的方式可以处理变量,而下标是连续变化的,所以可以用循环的方式批量处理数据,而用单个变量名则不可以批量处理无规律数据
- 数组的单个元素本身就是正常变量,关键在处理方式上
- 这种批量处理数据的方式对应着新的代码编写方式,即采用循环在连续的地址空间中访问数据
2 字符串基础
- 用来存放字符数据的数组叫字符串数组;
- 字符数组中的一个数组元素存放一个字符;
- 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符, 空字符是转义字符’ \0’,其ASCII码值为零。
- 在C语言中,是将字符串作为字符数组来处理的,字符串是以’\0’结尾的字符数组(重要,概念的区别)
实际应用中,关心的是字符串的有效长度而不是字符数组的长度 - 为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’。
- ’\0’代表ASCII码为0的字符;
- 从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做;
- 用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志;
cin
3 puts函数
-
puts函数----输出字符串的函数
一般形式为:
puts (字符数组)
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端,并用换行符’\n’替换’\0’。char str[20]=”China”;
puts(str);
输出:China -
用puts函数输出的字符串中可以包含转义字符。
例如:
char str[]={″China\nBeijing″};
puts(str);
输出结果:
China
Beijing
4 gets函数
- gets函数----输入字符串的函数
一般形式为:
gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
例如:
char str[20];
gets(str);
Computer↙将输入的字符串"Computer"送给字符数组str
5 注意:
注意:用puts和gets函数只能输入或输出一个字符串,不能写成
puts(str1,str2) 或 gets(str1,str2)
与cin相比,gets()可以接收包含空格的字符串,cin不能。它们两个都是以’\0’作为输入结束标志。
6 字符串处理
1、字符串复制
void stringcopy(char d[], char s[])
{
int i = 0;
while(s[i] != ‘\0’) //通过‘\0’判断字符串是否结束
{
d[i] = s[i];
i++;
}
d[i] = ‘\0’;
}
2、字符串拼接
void stringconnect(char str1[], char str2[])
{
int i = 0, j = 0;
while (str1[i] != ‘\0’)
i++;
while (str2[j] != ‘\0’)
{
str1[i+j] = str2[j];
j++;
}
str1[i+j] = ‘\0’; }
7 字符和字符串库函数
1. strcat函数----字符串连接函数
其一般形式为:
- strcat(字符数组1,字符数组2)
- 其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。
使用字符串函数时,在程序开头用
#include <string.h>
char str1[30]=”People”;
char str2[]=”China”;
cout << strcat(str1,str2);
输出:PeopleChina
2. strcpy和strncpy函数-字符串复制
strcpy一般形式为:
- strcpy(字符数组1,字符串2)
- 作用是将字符串2复制到字符数组1中去
3.关于strcpy函数的几点说明
(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,″China″);
(3)复制时连同字符串后面的′\0′一起复制到字符数组1中。
(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组,因为数组名代表该数组的首地址。如:
str1 = ″China″; 不合法
str1 = str2; 不合法
- 用strcpy函数只能将一个字符串复制到另一个字符数组中去。
- 用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。下面是合法的使用:
char a[5],c1,c2;
c1=′A′; c2=′B′;
a[0]=′C′; a[1]=′h′; a[2]=′i′;
a[3]=′n′; a[4]=′a′;
(5)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去
strncpy(str1,str2,2); - 作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符
- 复制的字符个数n不应多于str1中原有的字符
char a[]="people";
strncpy(a, "china",2);
cout << a << endl;
3. strcmp函数----字符串比较函数
其一般形式为
strcmp(字符串1,字符串2)
作用是比较字符串1和字符串2
strcmp(str1, str2);
strcmp(”China”, ”Korea”);
strcmp(str1, ”Beijing”);
- strcmp函数----字符串比较函数
- 字符串比较的规则是:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到’\0’为止,如全部字符相同,认为两个字符串相等。
- 若出现不相同的字符,则以第一对不相同的字符的比较结果为准,比较的是ASCII码值的大小
比较的结果由函数值带回
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为一正整数。
(3) 如果字符串1<字符串2,函数值为一负整数。
4. strlen函数----测字符串长度的函数
其一般形式为:
strlen (字符数组)
它是测试字符串长度的函数
函数的值为字符串中的实际长度,不是字符数组的长度
char str[10]=”China”;
cout << strlen(str);
输出结果是5
也可以直接测试字符串常量的长度
strlen(”China”);
5. strlwr函数----转换为小写的函数
其一般形式为
strlwr (字符串)
函数的作用是将字符串中大写字母换成小写字母
6. strupr函数----转换为大写的函数
其一般形式为
strupr (字符串)
函数的作用是将字符串中小写字母换成大写字母
7.案例一——查单词个数
例 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
解题思路:问题的关键是怎样确定“出现一个新单词了”
单纯判断空格数是不完整的(因为单词间可能出现多个空格)
从第1个字符开始逐个字符进行检查,判断此字符是否是新单词的开头(自己不是空格,并且前面的字符是空格),如果是,就使变量num的值加1,最后得到的num的值就是单词总数
方法一:常规方法
#include <iostream>
using namespace std;
int main()
{
char string[81], c;
int i, num = 0, word = 0;//作为是否为一个单词开始的标志
gets_s(string);
for (i = 0; (c = string[i]) != '\0'; i++)
if (c ==' ') word = 0;
else if (word == 0)/*因为判断一个单词出现需要满足两个条件,不是空格并且前面是空格*/
{
word = 1;
num++;
}
cout << num << " words" << endl;
}
方法二:双指针法
#include<iostream>
using namespace std;
int main()
{
cout << "请输入一串字符:" << endl;
//getchar();//走出缓冲区
char str[100] = { 0 };
cin.getline(str, 50);
int length = strlen(str);
int src = 0;
int end = 0;
int count = 0;
while (end <= length)
{
if (isalpha(str[src]) && (!isalpha(str[end])))
{
count++;
src = end;
}
if (!isalpha(str[src]))
{
src++;
}
end++;
}
cout<<"单词的个数是:"<<count<<endl;
}
8.案例二——比较三个字符串的大小
有3个字符串,要求找出其中最大者。
解题思路:设一个二维的字符数组str,大小为3×10。每一行存放一个字符串 char str[ 3 ][ 10 ]; 关键是如何存放这三个字符串,用二维数组可以充分利用C语言的能力(用循环控制访问) ![在这里插入图片描述](https://img-blog.csdnimg.cn/642ae88a29704f0daf4d2a88000dee9a.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/49e5764c77d34ff09537682bf858131c.png)8 结构基础
- 注意:
将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型,因为可以定义出许许多多种具体的结构体类型。
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1,student2;
8.1 注意:
(1)不能将一个结构体变量作为一个整体进行输入和输出。
(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(3)成员也可以是一个结构体变量。
(4) 成员名可以与程序中的变量名相同,二者不代表同一对象。
在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:
引用结构体变量中成员的方式为
- 结构体变量名.成员名
- 例如, student1.num表示student1变量中的num成员,即student1的num(学号)项。可以对变量的成员赋值,
- 例如: student1.num=10010;
- “.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。上面赋值语句的作用是将整数10010赋给student1变量中的成员num。
(2) 如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。
#include <stdio.h>void main()
{ struct student {
long int num; char name[20]; char sex; char addr[20]; }a;
a.num = 10101;
strcpy(a.name, ″LiLin″);
a.sex = ′M′;
strcpy(a.addr, ″123 Beijing Road″;
}
8.2 结构案例——得票的统计程序
对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i, j;
char leader_name[20];
cout << "请输入姓名[li,zhng,fun]【总共10个】:" << endl;
struct Person
{
char name[20];
int count;
} leader[3] = { {"li",0 },{"zhang", 0}, {"fun",0}};
for (i = 1; i <= 10; i++)
{
cin >> leader_name;
for (j = 0; j < 3; j++)
{
if (strcmp(leader_name, leader[j].name) == 0)
{
leader[j].count++;
}
}
}
cout << endl;
for (i = 0; i < 3; i++)
{
cout << leader[i].name << "\t" << leader[i].count << endl;
}
}
8.3 typedef语句
typedef用于给数据类型起别名,常在定义结构时使用
形式一:
typedef struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}StudentTpye;
方式二:
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
typedef struct student StudentTpye;
typeof也可以为其他类型的变量起别名
typedef也可以为其他类型起别名。
typedef int Myint;
Myint a = 0; int a = 0;
typedef float Myfloat;
Myfloat b = 1.2; float b = 1.2;
typedef int Myarr[20];
Myarr array; int array[20];
typedef int * Mypointer;
Mypointer pointer; int *pointer;
结构体与函数
#include<iostream>
using namespace std;
struct student {
char name[30];
int grade[3];
};
int SumGrade(struct student s)
{
int i, sum = 0;
for (i = 0; i < 3; i++)
{
sum+=s.grade[i];
}return sum;
}
int main()
{
struct student a = { "李四",{65,76,89} };
cout << a.name << "三门课总成绩为:" << SumGrade(a) << endl;
}
#include<iostream>
using namespace std;
struct student
{
char name[30];
int grade;
};
struct student MinGrade(struct student s[], int n)
{
int i, site = 0;
for (i = 1; i < n; i++)
{
if (s[i].grade < s[site].grade)
site = i;
return s[site];
}
}
int main()
{
//min是结构体,定义未初始化
struct student min, a[3] = { {"lisi",65},{"zhangsan",56},{"wangwu",89} };
min = MinGrade(a, 3);
cout <<"姓名:"<<min.name << "最低成绩为:" << min.grade << endl;
}