------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
字符串
1. 字符和字符处理
1) 复习ASCII码
字符和字符处理函数
c中存储的值65
A-Z 65-90
a-z 97-122
0-9 48-57
2) 使用字符判断函数
3) 使用字符转换函数
tolower
toupper
//字母转化为大写字母
char bc = tolower('A');
printf("%c\n",bc);
bc = toupper('a');
printf("%c\n",bc);
2. 字符串部分
"hello";
char str[] = "hello world";
printf("str = %s\n",str);
//指针指向了一个字符串常量
// 字符串常量本质上是一个地址, 指向其中第一个字符的地址
char *p;
p = "hello world";
printf("p = %s\n",p);
printf("*p = %c\n",*(p+1));
printf("*p = %c\n",p[1]);
printf("p[1] = %c\n",1[p]);
printf("*p = %c\n",*("hello world"+1));
printf("*p = %c\n","hello world"[1]);
printf("*p = %c\n",1["hello world"]);
c中存储的值65
A-Z 65-90
a-z 97-122
0-9 48-57
2) 使用字符判断函数
char c = 'A';
int r;
// 需求: 判断一个字母是不是大写字母
// 返回1表示是大写字母
// 返回0表示不是大写字母
r = isupper(c);
printf("%d\n",r);
c = 'a';
r = islower(c);
printf("%d\n",r);
/*
isdigit(c) 数字字符
isalpha(c) 字母(大小写)
isalnum(c) 数字字符和字母
islower(c) 小写字母
isupper(c) 大写字母
isspace(c) //空格类字符(' ')
*/
3) 使用字符转换函数
tolower
toupper
//字母转化为大写字母
char bc = tolower('A');
printf("%c\n",bc);
bc = toupper('a');
printf("%c\n",bc);
2. 字符串部分
1.什么是字符串
- 简单的字符串”itcast”
- 一个’i’是一个字符
- 很多个字符组合在一起就是字符串了
2. 字符串的初始化
- char a[] = “123”; 和 char a [] = {‘1’,’2’,’3’};的区别,可以比较大小
- “123”其实是由’1’、’2’、’3’、’\0’组成
- “123”的存储分布
- 字符串的输出”%s”,’\0’是不会输出的
"hello";
char str[] = "hello world";
printf("str = %s\n",str);
//指针指向了一个字符串常量
// 字符串常量本质上是一个地址, 指向其中第一个字符的地址
char *p;
p = "hello world";
printf("p = %s\n",p);
printf("*p = %c\n",*(p+1));
printf("*p = %c\n",p[1]);
printf("p[1] = %c\n",1[p]);
printf("*p = %c\n",*("hello world"+1));
printf("*p = %c\n","hello world"[1]);
printf("*p = %c\n",1["hello world"]);
3. 字符串转换函数
需求: "12345" 转化为一个整型 int num = 12345;
思路:
1. atoi函数---把一个字符串转化为整型
2. atof函数
3. strtol("1010",NULL,2)
1. atoi函数---把一个字符串转化为整型
2. atof函数
3. strtol("1010",NULL,2)
//1. atoi函数---把一个字符串转化为整型
char *str = "-12345";
int num; //12345
num = atoi(str);
printf("num = %d\n",num);
//测试
// "12345abc"
// "12345abc12"
// "-123" 支持负数
// "+123"
//2. atof函数
char *str2 = "12.34567";
double num2;
num2 = atof(str2);
printf("num2 = %f\n",num2);
//一个字符串转化为long, 指定进位
//3. strtol("1010",NULL,2)
//二进制数
char *str3 = "1010";
// 第三个参数指定了转化的进制
long num3 = strtol(str3, NULL, 2);
printf("num3 = %ld\n",num3);
4. 常用的字符串处理函数的使用
计算字符串长度: strlen(str)
字符串比较 strcmp(str1, str2) //返回值
字符串连接 strcat(dst, src) //空间
//<1>strlen
//<2> strcpy 字符串复制拷贝
char str[2]={};
// str存储字符串 "shijie nihao"
// 不能这样做
// str = "shijie nihao";
//效果:"shijie nihoa"复制到str中
//细节: 需要注意目标字符串需要有足够的空间
// 否则程序可能"奔溃"
strcpy(str, "shijie nihoa");
printf("str = %s\n",str);
//<3>字符串比较---比较两个字符串的大小
char *str1 = "helloA";
char *str2 = "helloD";
//需求: 判断这两个字符串是否相同
//解决: 使用strcmp这个函数
//int strcmp(const char *, const char *);
int r = strcmp(str1, str2);
printf("r = %d\n",r);
//返回值:
// r = 0, 这两个字符串相同的
// r < 0, 前面字符串比比后面的字符串小
// r > 0, 前面的字符串比后面的大
//<4>字符串的链接 strcat
char str[128] = "tian wang gai di hua";
char *src = " xiao ji dun mo gu";
//后面的参数中的字符串拼接到前面字符串的后面
//细节: 前面的数组应该有足够的空间
strcat(str, src);
printf("str =%s\n",str);
5. 字符串查找
字符查找(查找最后一个字符)
//字符串查找
char *str = "sheng huo ru ci mei hao, wo que ru ci bao zao, zhe yang bu hao,bu hao";
char c = 'h';
//char *strchr(const char *, int);
//char *p = strchr(str, c);
char *p = strrchr(str, c);
if(p != NULL)
{
printf("FIND\n");
printf("%c\n",*p);
printf("%s\n",p);
}
//想要在str中查找一个字符zao是否存在
//char*strstr(const char *, const char *);
char *q = strstr(str, "zao");
if(q != NULL)
{
printf("找到了子串\n");
printf("->%s\n",q);
}
6. 字符串分割
strtok (token)
"hello world "
//字符串分割
// 分割出每个单词 strtok
char str[] = "jin tian-tian.qi hao qing lang";
//参数1: 传入需要分割的字符串
//参数2: 使用那些字符分割这个字符串
char *p = strtok(str, " ");
printf("p-> %s\n",p);
//strtok第二次开始分割, 第一个参数传入NULL
p = strtok(NULL, " ");
printf("p-> %s\n",p);
p = strtok(NULL, " ");
printf("p-> %s\n",p);
//如何使用while循环和strtok分割字符串
//细节: strtok会把字符串中的分隔符置为'\0'
//细节: 第二个参数中传入多个分隔符组成的字符串
char *p = strtok(str, " -.");
while (p) {
printf("p->%s\n",p);
p = strtok(NULL, " -.");
}
printf("str = %s\n",str);
指针数组掌握
1. 顺序输出
2. 逆序输出
3. 找到最长单词
4. 排序
7. sprintf 和 scanf
字符串和其他数据转化字符串转化为其他类型
atoi
atof
strtol
需求: 把其他类型转化为字符串
int age=20;
int sex='B';
"20,B"
使用sprintf
// 需求: 把其他类型转化为字符串
int age=20;
int sex='B';
// 转化为 "20,B"
// printf干的事情
// (1)输入的数据转化为字符串
// (2)输出这个字符串
//printf("%d,%c",age,sex);
char str[256]={};
// 把其他类型的数据, 以指定的格式
// 转化为字符串之后存储到str中
sprintf(str, "%d,%c",age,sex);
printf("str = %s\n",str);
//sscanf函数
char *info = "zhangsan,B,12,80.5";
char name[256]={};
char gender;
int myage;
float score;
//把info以"%s ,%c,%d,%f"分解出出来
// 把数据放到name,gender ....
sscanf(info, "%[^,],%c,%d,%f",name,&gender,&myage,&score);
printf("name = %s\n gender =%c myage = %d score = %f",name,gender,myage,score); <br clear="none" />
8. 常用字符串处理函数的实现
如何实现
strrchr 字符串中查找匹配的最后一个字符
#import <Foundation/Foundation.h>
// strchr 函数
char *myStrchr(const char *str,char a)
{
char *p=(char *)str;
while(*p){
if(*p==a){
return p;
}
p++;
}
return NULL;
}
//strrchr 函数 字符串中查找匹配的最后一个字符
//"hello world"
//'0'
//每次都寻找比较o这个字符,如果找到了,不立即返回,而是继续找下一个指定字符
//循环最后在返回最后一个字符的位置
char *mystrrchr(const char *str,int a)
{
char *q=NULL;
char *p=(char *)str;
while (*p) {
if (*p==a) {
q=p;
}
p++;
}
return q;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// strchr 字符串中查找字符串
// 习惯:通过一个函数的原型指定函数的使用方法
// 函数原型:char *strchr(const char *,int);
char str[234]="hello world jin tian tian qi hen hao",a;
scanf("%c",&a);
// char *p = myStrchr(str, a);
// if (p) {
// printf("FIND\n");
// puts(p);
// }
char *p = mystrrchr(str,a);
if (p) {
printf("FIND\n");
puts(p);
}
}
return 0;
}
strlen 计算字符串长度
#import <Foundation/Foundation.h>
//strlen 计算字符串长度
//传入参数”hello“
//返回 5
long mystrlen(const char *str)
{
char *p=(char *)str;
long count =0;
while (*p) {
p++;
count++;
}
return count;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str[23]="hello";
long count=mystrlen(str);
printf("%ld\n",count);
}
return 0;
}
示例 strcpy 复制字符串
//思路:应该有两个指针:第一个指针指向源字符串char *p;
// 第二个指针指向目标字符串,char *q;
// 复制:*q=*p;
// 结束条件:源字符串字符为”\0“,结束;
//功能:源字符串复制到目标字符中
//参数1:目标字符串:
//参数2:源字符串
//返回值:返回传入的目标字符串的地址:
#import <Foundation/Foundation.h>
// 重点:strcpy 复制字符串
//char *str='"hello world"
//char buf[]={};//一个一个字符拷贝
//char buf[]="hello world";
char *mystrcpy(char *dst,const char *src)//const 不能改变*src
{
//char *q=(char *)src;
//char *p=dst;
//while 循环完之后,dst指向‘\0’的后面
char *p=dst;
while ((*dst++ = *src++));//括号里面还可以(*src)(*p)
/*{
//源字符串字符,复制给目标字符串;
// *dst=*src;(可有可无)
//dst++;
//src++;
}*/
//*dst='\0';
//return dst;
//保存返回的目标字符串的指针;
return p;//返回值目的:支持链式表达
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str[23]="hello";
char buf[234]="";
mystrcpy(buf, str);
puts(buf);
}
return 0;
}
示例 strcmp 比较字符串
#import <Foundation/Foundation.h>
//strcmp 比较字符串
//思路:判断这两个字符串是否相同
//”helloA“
//”helloD“
//两个字符串逐个比较,一旦发现不同,立即返回差值;
//比较的退出条件:(1)如果任意一个字符串达到了结尾,退出比较
// (2)或者两个字符是不同的,无需比较,退出比较
// 循环完成之后,返回结果(大于0,==0,小于0)
char mystrcmp(const char *str,const char *buf)
{
//while ((str&&buf)&&(*str==*buf)) {
while (str&&(*str==*buf)) {
str++;
buf++;
}
return *str-*buf;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str[23]="hello";
char buf[234]="helloA";
mystrcmp(str, buf);
int r=mystrcmp(str, buf);
printf("%d",r);
}
return 0;
}
示例 strcat 连接字符串
#import <Foundation/Foundation.h>
//strcat 连接字符串
//char str1[124]="hello";
//char str2[]="world"
//str2这个字符串附加到str1的后面
//strcat(str1,str2)
//参数dst:表示目标字符串:
//参数src:表示源字符串
//返回值:返回传入函数中的目标字符串的地址:
//原理:“hello” + “world” = “hello world”
//两步:(1)找到目标字符串结尾‘\0’的位置 (2)把源字符串复制到目标字符串的结尾:
//
char *mystrcat(char *dst,const char *src)
{
char *p=dst;
//找到目标字符串的结尾‘\0’的位置
while (*dst) {
dst++;
}
//dst<---src
//src起始位置的 字符串拷贝到dst起始位置;
while((*dst++=*src++));
return p;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str1[123]="hello ";
char str2[123]="world";
mystrcat(str1, str2);
puts(str1);
}
return 0;
} <br clear="none" />
示例 strstr 字符串中查找字符串
#import <Foundation/Foundation.h>
//strstr 字符串中查找字符串
//函数用法:char *str=“shi jie ni hao”
//char *substr="jie"
//在str这个字符串中查找substr的位置
//char *p=strstr(str,substr);
//原理:“shi jie ni hao”
// jie 逐个比较
//参数str,表示传入的主字符串
//参数substr,表示传入的字符
//返回值:返回substr在str中的位置
char *mystrstr(const char *str,const char *substr)
{
long len = strlen(substr);
while (*str) {
//puts(str);
//puts(substr);
//puts("");
//比较str和substr的前三个字符是否相同
//如果相同,说明找到了子串;
//strncmp()比较两个字符串的前n个字符
if (strncmp(str, substr, len)==0) {
return str;
}
str++;
}
return NULL;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str[234]="shi jie ni hao";
char substr[234]="jie";
char *p=mystrstr(str,substr);
if (p) {
printf("FIND\n");
printf("p=%s\n",p);
}
}
return 0;
}
示例 atoi 函数 功能字符串转化为整数
#import <Foundation/Foundation.h>
//实现stoi函数
//char str[]="12345";
//int num=stoi(str);
//原型:int atoi(const char *);
//原理: "1" '1'-'0'=1
//"12" '2'-'0'=2 1*10+2=12
//"123" '3'-'0'=3 12*10+3=123
//"1234" '4'-'0'=4 123*10+4=1234
//num=num*10+(*str-‘0’)
int myatoi(const char *str)
{
int num=0;
int flag = 1;
//如果第一个字符是 '-'
if(*str == '-')
{
flag = -1;
str++;
}
if(*str == '+')
{
str++;
}
while (*str) {
//*str 每次都是其中的数字字符
num=num*10+(*str-'0');
str++;
}
return num*flag;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
char str[123]="12345";
int num=myatoi(str);
printf("%d",num);
}
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//有一个字符串
//char str[]="ren you bei huan li he,yue you yin qing yuan que";
//(1)输出每个单词:------使用strock分割
// char str[]="ren you bei huan li he,yue you yin qing yuan que";
// char *p=strtok(str, " ,");
// while (p) {
// printf("p=%s\n",p);
// p=strtok(NULL, " ,");
// }
//(2)所有的单词逆序输出---
//(3)找到最长的单词
//(4)所有单词排序后输出
// 指针数组的基本用法
// int a[12];
// char b[12];
// char *b[12];
// char *a[3]={};
// a[0]="abc";
// a[1]="def";
// a[2]="ghi";
// puts(a[0]);
char str[128]="ren you bei huan li he,yue you yin qing yuan que";
char *a[128]={};
int count=0; //分割出得单词的个数;
char *p=strtok(str, " ,");
while (p) {
a[count]=p;
count++;
p=strtok(NULL, " ,");
}
//for (int i=0; i<count; i++) {
for (int i=count-1; i>=0; i--) {
puts(a[i]);
}
}
return 0;
}