基本概念
1.字符串:由字符组成的字符数组,且最后一个元素为’\0’。
2.’\0‘占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。
3.初始化:
char str[6] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};
char str[] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};
char str[] = {“Hello”};
char str[] = “Hello”;
4.字符指针:指向字符型数据的指针变量。
5.字符串的地址:字符串常量本身就代表存放它常量的首地址,是一个地址常量(如: char * p = “Hello”; 与 char *p; p = “Hello”; 是等价的。由于"Hello"保存在只读常量存储区中,此时,不能对p所指向的存储单元进行写操作,即 *p = 'W’是错误的)。
6.但如果"Hello"保存在一个数组中,char str[10] = “Hello”; char *p = str;,则 *p = 'W’是正确的,表示将str中第一个字符修改为W。
7.对单个字符进行赋值操作可以使用赋值运算符,但字符串不行,只能用strcpy()。
8.字符数组的循环通常不使用计数控制,而使用条件控制,利用字符串结束标志’\0’判断是否遍历结束。
9.为防止实参在被调函数中被修改,可在形参前面加const。
字符串的输入输出
1.按c格式符,一个字符一个字符单独输出:
for (i = 0; str[i] != '\0'; i++)
{
printf("%c",str[i]);
}
2.按s格式符,整体输出:
scanf("%s",**str**); //注意:此处不用添加取地址符&
/*表示读入一个字符串,**直到遇到空白字符为止**,当遇到空白字符时,空白字符之后的字符留在了**输入缓冲区**中,下次遇到scanf()时自动被读取*/
printf("%s",str);
/*表示输出一个字符串,直到遇到'\0'为止*/
3.运用gets()函数:
gets(str);
/*以回车符'\n'作为字符串终止符,同时将'\n'从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读走'\n',仍留在缓冲区中*/
4.运用puts()函数:
puts(str);
/*从括号中参数的地址开始,依次输出存储单元中的字符,当遇到'\0'时结束,并且自动输出一个换行符*/
5.运用fgets()函数:
fgets(str,sizeof(str),stdin);
/*限制输入字符串不超过数组大小*/
gets()和scanf()存在的问题
不能限制输入字符串的长度,容易引起缓冲区溢出;使用这两个函数时,要确保输入字符串的长度不超过字符串的大小。
字符串处理函数
前提:以下函数均包含在头文件<string.h>中
函数功能 | 函数 | 功能描述及说明 |
---|---|---|
求字符串长度 | strlen(str); | 不包括’\0’ |
字符串复制 | strcpy(str1,str2); | 将str2复制到str1中,确保str1足够大 |
字符串比较 | strcmp(str1,str2); | 比较ASCII值,str1>str2时,返回值>0,以此类推 |
字符串连接 | strcat(str1,str2); | 将str2连接在str1后面,覆盖’\0’,str1应足够大 |
”n族“字符串复制 | strncpy(str1,str2,n); | 将str2至多前n个字符复制到str1中 |
”n族“字符串比较 | strncmp(str1,str2,n); | 至多比较n个字符 |
”n族“字符串连接 | strncat(str1,str2,n); | 至多添加n个字符 |
代码
字符串排序
#include <stdio.h>
#include <string.h>
#define N 150 //字符串个数
#define MAX_LEN 150 //字符串最大长度
void SortString (char str[][MAX_LEN],int n);
int main()
{
int i,n;
char name[N][MAX_LEN];
printf("How many countries?");
scanf("%d",&n);
getchar(); //读走缓冲区的回车符
printf("Input there names:\n");
for (i = 0; i < n; i++)
gets(name[i]); //输入n个字符串
SortString(name,n);
printf("Sorted results:\n");
for (i = 0; i < n; i++)
puts(name[i]); //输出排序后的n个字符串
return 0;
}
/*交换法实现字符串按字典顺序排列*/
void SortString (char str[][MAX_LEN],int n)
{
int i,j;
char temp[MAX_LEN];
for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if (strcmp(str[i],str[j]) > 0)
{
strcpy(temp,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],temp);
}
return;
}
函数实现字符串复制
void MyStrcpy (char desStr[],char srcStr[])
{
int i = 0;
while (srcStr[i] != '\0')
{
dstStr[i] = srcStr[i];
i++;
}
dstStr[i] = '\0';
}
void MyStrcpy (char *desStr,char *srcStr)
{
while (*srcStr != '\0')
{
*dstStr = *srcStr;
srcStr++;
dstStr++;
}
*dstStr = '\0';
}
函数实现字符串连接
/*返回连接后字符串的首地址*/
char *MyStrcat (char *dstStr,char *srcStr)
{
char *pStr = dstStr;
/*将指针移到字符串dstStr的末尾*/
while (*dstStr != '\0')
dststr++;
for (; *srcStr != '\0'; dstStr++,srcStr++)
*dstStr = *srcStr;
*dstStr = '\0';
return pStr; //返回连接后字符串的首地址
}