字符串是数据结构中相对简单的一种数据结构。
关于字符串的基本知识:
1:字符与字符串
字符常量:字符常量是用单撇号括起来的一个字符
<常见的控制字符也是一种特殊形式的字符常量,以\开头的字符序列,在屏幕上不能显示的>
2:字符与字符串的存储
1)字符
将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII码存放到存储单元中。
在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样字符型数据与整型数据之间可以通用。
所以一个字符数据既可以以字符形式输出,也可以以整数形式输出。——运用的其实就是ASCII码
关于字符的问题,在做输出的时候,可以输出字符类型的,也可以输出整型的。这二者通用。另有一个常见的问题就是大小写转换的问题,还有就是在数据结构中模式匹配的问题。这在接下来会依次探讨:
e.g.1:大小写字符转换
#include <stdio.h>
void main()
{
char c1,c2;
c1=‘a’;
c2=‘b’;
c1=c1-32;
c2=c2-32;
printf("%c%c".c1,c2);
}
是因为大小写在ASCII码表中相差32个单位。所以用小写的存储减去32就可以得到大写的。
2)字符串
字符串常量是一对双撇号括起来的字符序列。
C语言规定:在每个字符串常量的结尾加一个"字符结束标识",以便判断字符串结束。以'\0'作为字符串结束标志。所以如果说是“china”的字符串,它其实是占6个字符,而不是5个字符。
2:整数与字符串之间的转换
e.g.1怎么将整数转化为字符串,并且不用函数itoa?
分析:itoa函数如何使用?
itoa函数是取整数输入值,并将其转换为相应数字的字符串。
函数原型:char *itoa(int value,char *string,int radix);
原型说明:
value:表示欲转换的数据
string:目标字符串的地址
radix:转换后的进制数,可以是16进制,10进制等。
运用:
#include <iostream>;
#include <stdio.h>
int main(void)
{
int number = 12345;
char string[7];
itoa(number,string,10);
printf("integer = %d string = %c\n",number,string[1]);
return 0;
}
如果不用itoa函数又该如何转换?
方法:整数转换为字符串,可以采用加'0',在逆序的方法,整数加'0'就会隐形的转换为char类型的数。
运用:
<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
int main(void)
{
int num=12345,j=0,i=0;
char temp[7],str[7];
while(num)
{
temp[i]=num%10+'0';
i++;
num=num/10;
}
temp[i]=0;
printf("temp=%s\n",temp);
i=i-1;
printf("temp=%d\n",i); //刚刚转换的字符串是逆序的,必须把它反转过来
while (i>=0)
{
str[j]=temp[i];
j++;
i--;
}
str[j]=0;
printf("string =%s\n",str);
return 0;
}
e.g2:字符串又是如何转换成整数的?
分析:字符串转换成整数,可以采用减'0'再乘以10累加的方法。字符串减'0'就会转化为整型数据。
运用:
#include <iostream>
#include <stdio.h>
int main(void)
{
int num = 12345,j=0,i=0,sum=0;
char temp[7]={'1','2','3','4','5','\0'},str[7];
while(temp[i])
{
sum=sum*10+(temp[i]-'0');
i++;
}
printf("sum=%d\n",sum);
return 0;
}
针对上面的问题有个疑问,为什么加上'\0'就可以辨别字符与整型的区别呢?
对于这个问题还得分析下'\0'这个东西,'\0'代表ASCII码为0的字符,ASCII码为0的字符不是一个显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只是起到一个供辨别的标志。
补充:C语言标准库下的字符串函数
先约定如下:s、t分别表示(char*)类型的参数,cs、ct表示(const char *)类型的参数,它们都表示字符串。
n表示size_t类型的参数,c是整型参数。
常见的字符串函数有:
size_t strlen(cs); //求出cs的长度
char *strcpy(s,ct);//把ct复制到s中去
char *strncpy(s,n,ct);//把ct中的n个字符复制到s中去
char *strcat(s,ct);//把ct复制到s字符串之后
char *strncat(s,n,ct);//复制ct中的n个字符到s中去
int strcmp(cs,ct);//比较cs与ct的大小,分别返回正值、0、负值
int strncmp(cs,n,ct);//比较cs和ct的大小,最多比较n个字符
char *strchr(cs,c);//在cs中查找第一个c出现的位置,并用指向这个位置的指针表示,如果没有则返回null;
char *strrchr(cs,c);//在cs中查找最后一个c出现的位置
size_t strspn(cs,ct);//在cs中查找全部由ct里字符组成的序列,并返回其长度
size_t strcspn(cs,ct);//在cs中查找全部由非ct里字符组成的序列,并返回其长度
char *strpbrk(cs,ct);//在cs里查找ct里的字符,返回第一个满足条件的字符出现的位置,没有时返回NULL
char *strstr(cs,ct);//在cs中查寻串ct(查询子串),返回ct作为cs的子串的第一个出现的位置,ct未出现在cs里时返回NULL
char *strerror(n);//返回与错误编号n相关的错误信息串(指向该错误信息串的指针)
char *strtok(s,ct); //在s中查寻由ct中的字符作为分隔符而形成的单词