内容提要
数组
字符相关操做
综合案例:学生成绩管理系统
数组
字符数组
字符串的基础操作
字符串拼接
语法:
strcat(
数组名
(“
字符串
1”),
需要拼接的字符串
("
字符串
2"));
引用:
string.h
#include <stdio.h>
#include <string.h>
int
main
(
int
argc
,
char *
argv
[])
{
char
name
[
20
];
printf
(
"
请输入您的姓名
:\n"
);
fgets
(
name
,
sizeof
(
name
)
/
sizeof
(
char
),
stdin
);
//
通过外设输入(键盘)
fputs
(
strcat
(
name
,
"
快跑!
"
),
stdout
);
//
输出数据到外设(显示器)
//puts(strcat(name,"
快跑!
"));//
输出数据到外设(显示器)
// fputs(strcat("
你好
",name),stdout);//
输出数据到外设(显示器)
return
0
;
}
注意:
①
字符串
1
必须是字符数组,的长度必须足够大,以便于能够容纳被链接的字符串。
②
连接后系统将自动取消
字符串
1
后面的结束符
\0
③
字符串
2
可以是字符数组名,也可以是字符串常量,如:
strcat(s1,"def"); strcat(s1,s2);
字符串拷贝
语法:
strcpy(
数组名
,
字符串
)
引入:
string.h
说明:这个函数适合给字符串赋值
char
str
[
20
]
=
"张三
"
;
//
正确,字符数组的初始化
char
str
[
20
];
str
=
"李四
"
;
//
错误,我们不能对字符数组进行字符串赋值
char
str
[
20
];
strcpy
(
str
,
"王二
"
);
//
正确,借助函数完成字符数组的赋值
案例:
#include <stdio.h>
#include <string.h>
int
main
(
int
argc
,
char *
argv
[])
{
char
name
[
20
];
printf
(
"
请输入您的名字:
\n"
);
fgets
(
name
,
sizeof
(
name
)
/
sizeof
(
char
),
stdin
);
//
重新赋值
strcpy
(
name
,
"
孙成龙
"
);
printf
(
"
同学的名字叫
%s\n"
,
name
);
return
0
;
}
字符串比较
语法:
strcmp(
字符串
1,
字符串
2)
字符串可以是常量,也可以是字符数组
引入:
string.h
功能:比较两个字符串对应的位置字符
ASCII
的大小(字典顺序比较)
返回值:
若 字符串
1
等于 字符串
2
,返回
0
若 字符串
1
大于 字符串
2
,返回正数(
>0
)
若 字符串
1
小于 字符串
2
,返回负数(
<0
)
说明:
①
执行这个函数时,自左到右逐个比较对应字符的
ASCII
的值,直到发现了不同字符或字符串结
束符
'\0'
为止。
②
对字符串不能用数值型比较符。比如:
"abc" == "abc"
,这种比较是错误的
③
字符串
1
与字符串
2
可以是字符数组,也可以是字符串常量。
案例:
#include <stdio.h>
#include <string.h>
int
main
(
int
argc
,
char *
argv
[])
{
//
创建两个数组,用来存放用户和帐号
char
username
[
20
],
password
[
8
];
printf
(
"
登录
"
);
printf
(
"
请输入您的账户:
\n"
);
scanf
(
"%s"
,
username
);
printf
(
"
请输入您的密码:
\n"
);
scanf
(
"%s"
,
password
);
//
校验
if
(
!
strcmp
(
username
,
"admin"
)
&& !
strcmp
(
password
,
"123456"
))
{
printf
(
"
登录成功!
\n"
);
}
else
{
printf
(
"
账户或者密码错误
!\n"
);
}
return
0
;
}
字符串长度
语法:
strlen(
字符串
)
引用:
string.h
注意:返回字符串中包含的字符的实际个数,不含
\0
案例:
#include <stdio.h>
#include <string.h>
void
test01
()
{
char
username
[
20
];
printf
(
"
请输入您的账户:
\n"
);
scanf
(
"%s"
,
username
);
//
获取字符串长度
unsigned long
len
=
strlen
(
username
);
//
排除
\0 hello\0,he\0llo\0
if
(
!
strcmp
(
username
,
"admin"
))
{
printf
(
"
账户输入正确!
%lu\n"
,
len
);
}
else
{
printf
(
"
账户输入错误!
%lu\n"
,
len
);
}
}
int
main
(
int
argc
,
char *
argv
[])
{
test01
();
return
0
;
}
案例
1
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
I LOVE YOU
分析:采用通过空格统计单词的方法。具体是:
①
用连续若干个空格算一个、一行开头的空格不计的方法决定单词数目;
②
从第一个字符开始逐个检查字符串中的每一个字符。若查到某一字符非空格,而其前面的字
符是空格,则表示新单词开始,让计数变量
num++
。否则,当前字符非空格,前面字符也非空
格,则非新单词,
num
不变;
③
用变量
word=0
或
1
来表示前面字符是空格或不是空格。则:

代码:
#include <stdio.h>
void
main
()
{
char
string
[
81
];
int
i
,
num
=
0
,
word
=
0
;
// num
:计数,
word
:单词个数校验
char
c
;
fgets
(
string
,
81
,
stdin
);
/*
从键盘输入一个字符串,
I LOVE YOU*/
for
(
i
=
0
;(
c
=
string
[
i
])
!=
'\0'
;
i
++
)
/*
从第一个字符开始判断是否串尾
*/
{
if
(
c
==
' '
)
word
=
0
;
/*
如不是串尾,若是空格
I LOVE YOU*/
else if
(
word
==
0
)
/*
如不是串尾、不是空格,而前一字符是空格
*/
{
word
=
1
;
num
++
;
}
/*
是新单词,计数
*/
}
printf
(
"There are %d words in this line.\n"
,
num
);
}
案例
2
有三个字符串,要求找出其中最大者。
分析:设计一个二维字符数组
str
3
,即
3
行
20
列。
①
可把
str[0]
、
str[1]
、
str[2]
看作
3
个一维字符数组,各有
20
个元素;
②
用
gets
函数分别输入
3
个字符串到
str[0]
、
str[1]
、
str[2]
中 ;
③
用字符串函数对
str[0]
、
str[1]
、
str[2]
进行比较,得到最大者。
#include <stdio.h>
#include <string.h>
void
main
( )
{
char
max
[
20
];
char
str
[
3
][
20
];
//
输入
3
个字符串
{"abc","bbc","ccc"}
int
i
;
//
完成初始化
for
(
i
=
0
;
i
<
3
;
i
++
)
gets
(
str
[
i
]);
/*
输入
3
个字符串
*/
// fgets(str[i],20,stdin)
if
(
strcmp
(
str
[
0
],
str
[
1
])
>
0
)
/*
比较,若串
0>
串
1*/
strcpy
(
max
,
str
[
0
]);
/*
把串
0
存入
string*/
else
strcpy
(
max
,
str
[
1
]);
/*
否则,把串
1
存入
string*/
if
(
strcmp
(
str
[
2
],
max
)
>
0
)
/*
再比较,若串
2>string*/
strcpy
(
max
,
str
[
2
]);
/*
把串
2
存入
string
,否则
string
不变
*/
printf
(
"\nthe largest string is:\n%s\n"
,
max
);
/*
输出
string*/
}
总结
数组是有序数据的集合。数组中的所有元素都必须是同类型的。用一个统一的名字和下标来唯
一的确定元素在数组中的位置。在程序中把循环和数组结合起来,对数组元素进行操作,可有
效地处理大批量的数据,提高工作效率。
正确定义数组。注意:元素的下标默认从
0
开始、防止下标越界。
注意数组的定义形式和数组元素的引用形式的本质区别。
二维数组元素在内存中按行存储。初始化时,按行赋值。
C
语言中无字符串变量,字符串是以字符数组形式存放的。系统在每个串尾自动加一个串结束
符
‘\0’
,但
‘\0’
不是字符串的组成部分。将含
n
个字符的串存入数组中时,数组长度应
≥n+1
。
字符串的运算要用字符串函数进行,要包含
“string.h”
头文件。
由基本类型的数据按一定规则构成的数据称为构造类型数据。