2019-8-9
字符指针①字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
②
char *ptr = "Hello";//将保存在常量存储区的"Hello"的首地址赋值给ptr
与
char *ptr;
ptr = "Hello";//是等价的,注意不能理解为将字符串赋值给ptr
③
char str[10] = "Hello";
char *ptr = str;//数组名代表数组的首地址
//等价于
char *ptr;
ptr = str;//等价于ptr = &str[0];将数组的首地址赋给字符指针ptr
④对于数组名str,不能使用str++
操作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能被改变的。
*(ptr+i):字符串中第i+1个字符,相当于*(str+i),即str[i]
也可以用ptr++,移动指针ptr,使ptr指向字符中的某个字符
⑤字符串的长度(指字符串所含的字符个数,但不包括最后的’\0’)与字符数组的大小(指字符串所包含的字符个数加上’\0’,故+1)不一样。
for(i = 0;str[i] != '\0'; i++ )
{
printf("%c",str[i]);//常用借助字符串结束标志'\0'识别字符串的结束
}
scanf("%s",str);//表示读入一个字符串,直到遇到空白字符(空格、回车符、制表符)为止
//如果输入带有空格的字符串(比如人名)只会读到空格以前而空格以后不会读入,留在了输入缓冲区中
printf("%s",str);//表示输出一个字符串,直到遇到字符串结束标志'\0'为止(注意这里可以带有空格输出)
gets():可以输入带有空格的字符串。以回车符作为字符串的终止符,同时将回车符从输入缓冲区读走,但不作为字符串的一部分。而scanf()不读走回车符,回车符仍留在输入缓冲区中。 gets()不能限制输入字符串的长度,很容易引起缓冲区溢出。同样即使scanf(“12s%”,name)也不能解决这个问题。当使用scanf()和gets()时,确保输入字符串的长度不超过数组的大小,否则使用限制输入字符串长度的函数: fgets(name,sizeof(name),stdin)
puts():用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个’\0’时输出结束,并且自动输出一个换行符’\n’
#include
#define N 12
int main()
{
char name[N];
char *ptrName = name;//声明一个指向数组name的字符指针ptrName
//注意这里,用字符指针输入字符串前提,必须保证字符指针事先已指向一个数组的首地址,如ptrName指向了数组name,如果只是单纯声明字符指针,编译会报错
printf("Enter your name:");
gets(ptrName);//输入字符串存入字符指针ptrName所指向的内存
//为提高程序安全性,也可以使用fgets(name,sizeof(name),stdin);
printf("Hello %s!\n",ptrName);
return 0;
}
⑥if(str1==str2)时合法语句,比较这两个地址的大小(作为指针,有不同的地址,一定为假),而不是比较字符串的大小,也不是比较字符串的内容。
函数功能:用字符指针作为函数参数,实现字符串复制(将str2复制到str1中)
void MyStrcpy(char *str1,char *str2)
{
while(*str2!='\0')//若当前str2所指字符不是字符串结束标志
{
*str1 = *str2;//复制字符
str2++;//使str2指向下一个字符
str1++;//使str1指向下一个存储单元
}
*str1 = '\0';//当复制循环结束时,在str1的末尾添加字符串结束标志
}
函数功能:用字符型数组作函数参数,计算字符串的长度
unsigned int MyStrlen(const char str[])
{
int i;
unsigned int len = 0;//计数器设置为0
for(i=0;str[i]!='\0';i++)
{
len++;//循环统计不包括'\0'在内的字符个数
}
return len;
}
函数功能:用字符指针作函数参数,计算字符串的长度
unsigned int MyStrlen(const char *pStr)//为防止实参在被调函数中被意外修改,在相应的形参前面加上类型限定符const
{
unsigned int len = 0;//计数器设置为0
for(;*pStr !='\0';pStr++)
{
len++;//循环统计不包括'\0'在内的字符个数
}
return len;
}
补充:
int型变量范围:-2147483648~2147483647
unsigned int型变量范围:0~4294967295
从函数返回字符串指针
函数功能:将字符串str2连接到字符串str1的后面
char *MyStrcat(char *str1,char *str2)
{
char *pStr = str1;//定义一个字符指针并保存字符串str1的首地址
while(*str1! = '\0')//当没有读到str字符串的结束标志
{
str1++;//将指针移动到字符串str1的末尾
}//注意这里,在读到'\0'之前时,指针已经移到了这个位置,当读到时跳出循环不再指向下一个
所以复制str2的首地址是'\0'之前的位置
for(;*str2!='\0';str1++,str2++)
{
*str1 = *str2;//将字符串str2复制到字符串str1的后面
}
*str1 = '\0';//在连接后的字符串的末尾添加字符串结束标志
return pStr;//返回连接后的新的字符串str1的首地址
}
char *f(); 声明的是一个返回字符指针的函数f()。如上代码
char(*f)(); 函数指针f。指向的函数没有形参,返回值是字符型。f是一个指针,表示该指针变量可以指向一个返回值为字符型的函数
⑦const类型限定符
数据传到被调函数内部,不希望其在函数内部被修改,防止数据被意外修改,用const对参数进行限定
⑧字符处理函数
函数原型 | 功能描述 |
---|---|
int isdigit(int c); | 判断是否为数字,返回真假值 |
int isalpha(int c); | 判断是否为字母,返回真假值 |
int isalnum(int c) | 判断是否为字母或者数字,返回真假值 |
int islower(int c) | 判断是否为小写字母,返回真假值 |
int isupper(int c) | 判断是否为大写字母,返回真假值 |
int tolower(int c) | 若c是大写字母,将c转换成小写字母后返回 |
int toupper(int c) | 若c是小写字母,将c转换成大写字母后返回 |
int isspace(int c) | 若c是空白符(换行符(’\n’)、空格符(’ ‘)、换页符(’\f’)、回车符(’\r’)、水平(’\t’)、垂直制表符(’\v’)),返回真值 |
int iscntrl(int c) | 若c是控制字符(水平、垂直制表符、换页符、响铃报警符(’\a’)、退格符(’\b’)、回车符、换行符),返回真值 |
int isprint(int c) | 若c是一个包含空格在内的可打印字符,返回真值 |
int isgraph(int c) | 若c是一个除空格以外的所有可打印字符,返回真值 |