重点学习字符串存储的特殊性,理解字符数组和字符串的区别。掌握字符串的3个方面的特殊性:初始化,输入输出,结束字符。掌握常用字符串内置函数的用法,另外还要掌握字符指针的特殊性以及字符数组的用法。
首先我们先来学习字符串常量,字符串常量是双引号括起的任意字符序列。字符串需要一个特殊的表示字符串结束的字符“/0
”,该字符是ASCII码值为0的字符,称为空字符。字符串常量中可以包含转义序列。
字符数组与字符串
Ø 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串
Ø 字符数组和字符串的区别是:字符串的末尾有一个空字符 ‘/0’
字符串可按如下方式声明并初始化:
char name[15]={ 'W', 'a', 'n', 'g', 'L', 'i', '/0'};//系统将自动加入一个空字符
char name[15] = "WangLi";
char password[] = "12345678";/*省略数组大小,系统自动计算,大小为后面的字符总数加1,最后一个元素存入一个空字符。*/
字符串I/0
函数
我们知道使用scanf语句的不足是接受的字符串中不能包含空格。
示例:
#include
<
stdio.h
>
void main()
... {
char s1[15];
char s2[] = ...{‘A’,’u’,’d’,’r’,’e’,’y’,’0’};
char s3[] = “Michael holding”;
int cnt = 0;
printf(“ 请向数组中输入一个姓名:”);
scanf(“%s”,s1);
printf(“ 显示字符串 ”);
printf(“第一个字符串是:”);
while(s1[cnt] != ‘0’)
...{
printf(“%c”,s1[cnt]);
cnt ++;
}
printf(“ 第二个字符串是:”);
printf(“%s”,s2);
printf(“ 第三个字符串是:”);
printf(“%s”,s3);
}
void main()
... {
char s1[15];
char s2[] = ...{‘A’,’u’,’d’,’r’,’e’,’y’,’0’};
char s3[] = “Michael holding”;
int cnt = 0;
printf(“ 请向数组中输入一个姓名:”);
scanf(“%s”,s1);
printf(“ 显示字符串 ”);
printf(“第一个字符串是:”);
while(s1[cnt] != ‘0’)
...{
printf(“%c”,s1[cnt]);
cnt ++;
}
printf(“ 第二个字符串是:”);
printf(“%s”,s2);
printf(“ 第三个字符串是:”);
printf(“%s”,s3);
}
使用gets()函数可以克服scanf()函数的局限性。Gets()函数只有在按下回车键后才会终止,这意味着gets()函数可以接收空格和制表符。由于gets()和puts()是无格式的输入输出函数的一部分,建议用fflush(stdin)函数清空缓冲区。
示例:
#include
<
stdio.h
>
void main()
... {
char name[30];
char address[30];
puts(“请输入您的姓名:”);
gets(name);//使用 gets函数允许输入空格
fflush(stdin);//清空缓存区
puts(“请输入您的地址:”);
gets(address);
fflush(stdin);
printf(“ 您的姓名和地址是: ”);
puts(name);//从键盘上读入一个完整的行,存入字符数组name。并用空字符'
void main()
... {
char name[30];
char address[30];
puts(“请输入您的姓名:”);
gets(name);//使用 gets函数允许输入空格
fflush(stdin);//清空缓存区
puts(“请输入您的地址:”);
gets(address);
fflush(stdin);
printf(“ 您的姓名和地址是: ”);
puts(name);//从键盘上读入一个完整的行,存入字符数组name。并用空字符'
printf("/n
雇员姓名是: ");
puts(name);
printf("/n
雇员所属部门是: ");
puts(dept);
printf("/n
雇员姓名是
:
%s",name);
printf("/n
雇员所属部门是
:
%s/n",dept);
puts
函数完全可以由
printf
函数取代。
当需要按一定格式输出时,通常使用 printf
函数。
字符串处理函数
Ø 与字符串有关的内置函数在头文件string.h中定义
Ø 要使用标准库字符串处理函数,程序前应该包含:#include <string.h>
其中常用的是:求字符串长度的函数(strlen)、字符串拷贝函数(strcpy)、字符串比较函数(strcmp)、字符串连接函数(strcat)。
示例1:
#include
<
stdio.h
>
#include < string .h >
void main()
... {
char arr[] = "Beijing";
int len1, len2;
len1 = strlen(arr);
len2 = strlen("Shanghai");
printf(" string = %s length = %d", arr, len1);
printf(" string = %s length = %d ","Shanghai",len2);
}
#include < string .h >
void main()
... {
char arr[] = "Beijing";
int len1, len2;
len1 = strlen(arr);
len2 = strlen("Shanghai");
printf(" string = %s length = %d", arr, len1);
printf(" string = %s length = %d ","Shanghai",len2);
}
string = Beijing length = 7
string = Shanghai length = 8
示例2:
#include
<
stdio.h
>
#include < string .h >
void main()
... {
char source[] = "Do you love me?";
char target[20];
strcpy(target,source);
printf(" 源字符串 = %s", source);
printf (" 目标字符串 = %s ", target);
}
#include < string .h >
void main()
... {
char source[] = "Do you love me?";
char target[20];
strcpy(target,source);
printf(" 源字符串 = %s", source);
printf (" 目标字符串 = %s ", target);
}
源字符串 = Do you love me?
目标字符串 = Do you love me?
示例3:
#include
<
stdio.h
>
#include < string .h >
void main()
... {
char username[15],pwd[15];
printf(" 请输入用户名: " );
gets(username);
printf(" 请输入密码: ");
gets(pwd);
if((strcmp(username,"John")==0) &&
(strcmp(pwd,"123456")==0))
printf(" 您已成功登录 ");
else
printf(" 用户名和/或密码无效 ");
}
#include < string .h >
void main()
... {
char username[15],pwd[15];
printf(" 请输入用户名: " );
gets(username);
printf(" 请输入密码: ");
gets(pwd);
if((strcmp(username,"John")==0) &&
(strcmp(pwd,"123456")==0))
printf(" 您已成功登录 ");
else
printf(" 用户名和/或密码无效 ");
}
#include
<
stdio.h
>
#include <string.h>
void main()
... {
char source_string[] = "Love me!";
char target_string[30] = "MMS";
strcat(target_string,source_string);
printf(" 源字符串 = %s", source_string);
printf(" 目标字符串 = %s ", target_string);
}
#include <string.h>
void main()
... {
char source_string[] = "Love me!";
char target_string[30] = "MMS";
strcat(target_string,source_string);
printf(" 源字符串 = %s", source_string);
printf(" 目标字符串 = %s ", target_string);
}
源字符串 = Love me
目标字符串 = MMS Love me
指向字符串的指针
Ø 在C语言中,可以将字符指针指向字符串
Ø 被指向的字符串可以是一个常量字符串,也可以是一个存储着字符串的字符数组
我们知道字符串本质上是字符数组,所以指向字符串的指针实际上就是指向字符数组的指针。
我们用字符数组保存一个人的姓名:如
Char name[5] = “Mike”;
在学习了指针以后,我们可以用字符串指针来表达一个人的姓名:如
Char *pname = “Mike”;
此时,由系统自动为pname分配5个字符的位置,并初始化为“Mike”。最后一个位置仍然是空字符’/0’。
示例:
#include
<
stdio.h
>
void main()
... {
char *ps="Do you love me?";
int n=10;
ps=ps+n;
printf("%s ",ps);
}
void main()
... {
char *ps="Do you love me?";
int n=10;
ps=ps+n;
printf("%s ",ps);
}
lives
字符指针数组
字符指针数组:一个数组中的各个元素都是字符指针
char *names [] = {"Apple", "Pear", "Peach", "Banana"};
示例:
void
main()
... {
char *names[] = ...{ "Apple",
"Banana",
"Pineapple",
"Peach",
"Strawberry",
"Grapes" };
char *temp;//声明了一个字符指针变量
printf(“ %s %s",names[2],names[3]);
temp = names[2];
names[2] = names[3];
names[3] = temp;
printf(" %s %s",names[2],names[3]);
printf(" ");
}
... {
char *names[] = ...{ "Apple",
"Banana",
"Pineapple",
"Peach",
"Strawberry",
"Grapes" };
char *temp;//声明了一个字符指针变量
printf(“ %s %s",names[2],names[3]);
temp = names[2];
names[2] = names[3];
names[3] = temp;
printf(" %s %s",names[2],names[3]);
printf(" ");
}
Pineapple Peach
Peach Pineapple
字符串作为函数参数
用户定义版字符串拷贝函数
void
mystrcpy(
char
dest[ ],
char
src[ ])
... {
int i = 0;
while(src[i] != '
... {
int i = 0;
while(src[i] != '
int
mystrlen (
char
*
s)
... {
int n = 0;
while (*s != '
... {
int n = 0;
while (*s != '
在学习过程中,自己要先把知识点掌握住;然后自己多上机操作,才能达到学习的效果。