C++之字符串

C++之字符串

字符串初始化

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
	char str[5][12] = { "calc", "notepad","mspaint","tasklist","pause" };
	//存储的是字符串
	str[0][0] = 'X';//*str[0] = 'X';
	char *p[5] = { "calc", "notepad","mspaint","tasklist","pause" };
	char *p1 = "calc";
	//存储的是指针
	for (int i = 0; i < 5; i++)
	{
		printf("%s %s\n", str[i], p[i]);
	}
	printf("%d\n",sizeof(str[1]));
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(p1));
	system("pause");
}

字符串使用注意

char str[100] = “calc”;//栈上开辟一块内存
char *p1 = (char[]) {‘m’,‘s’,‘p’,‘a’,‘i’,‘n’,‘t’,’\0’};//数组的形式,存储在堆上
char *p2 = “notepad”;//notepad在代码区,p2存储代码区的地址,此部分无法做修改
void main1()
{
*str = ‘A’;
printf("%s\n", str);

*p1 = 'X';
printf("%s\n", p1);//p1是一个数组,所以如果要输出整个数组
*p2 = 'X';
printf("%s\n", p2);
system("pause");

}
void main2()
{
char str1[100] = “qaioxiaolei”;
printf("%d\n", sizeof(str1));
printf("%d\n", strlen(str1));

system("pause");

}
void main3()
{
char str[5] = { ‘a’, ‘b’,‘c’,‘d’,‘e’ };
printf("%s", str);//批量显示必须要有’\0’,单字符显示不需要
for (int i = 0; i < 5; i++)
{
putchar(str[i]);
}
system(“pause”);
}
void main()
{
char *str = “iloveyou”;
printf("%s\n",str+3);//改变指针的位置输出不同的字符

system("pause");

}

字符串排序及strcmp实现

int mystrcmp(const char* str1, const char* str2)//这是下标法,思考如何使用指针法
{
if (str1 == NULL || str2 == NULL)
{
return 0;
}
int i = 0;
while (str1[i] == str2[i] && str1[i] != ‘\0’)
{
i++;
}
if (str1[i] == ‘\0’ && str2[i] == ‘\0’)
{
return 0;
}
else
{
if (str1[i] - str2[i] > 0)
{
return 1;
}
else
{
return -1;
}
}
}
int com(const void *p1, const void p2)
{
const char **pstr1 = p1;
const char **pstr2 = p2;
return -1
mystrcmp(*pstr1, *pstr2);
}
void main1()
{
char *str[10] = { “calc”,“notepad”,“manifest”,“123”,“qiaoxiaolei”,“liufei”,“liuhui”,“uuu”,“ddd”,“ahfj” };

qsort(str, 10, 4, com);//strcmp用于字符串排序
for (int i = 0; i < 10; i++)
{
	puts(str[i]);//如果此处字符数量不到10,程序报错
}
system("pause");

}
void main()
{
char str[100] = “qiaoxiaolei”;
_strset(str, ‘A’);
printf(“shuchu:%s”, str);

system("pause");

}

Strlen

int mystrlen(const char str)
{
int length = 0;
for (int i = 0;; i++)
{
/if ((str + i) == ‘\0’)
{
break;
}
/
if (str[i] == ‘\0’)//也是指针前移的方式
{
break;
}
length++;
}
return length;
}

Strcpy

char* mystrcpy(char dest, const char source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
for (int i = 0;; i++)
{
dest[i] = source[i];
if (source[i] == ‘\0’)
{
break;
}
}
return dest;
}
char* mystrcpyaddr(char* dest, const char* source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
char* phead = dest;
while(*source != ‘\0’)
{
*dest = *source;
source++;
dest++;
}
*dest = *source;

return phead;

}

Strstr

char* mystrstraddr(const char* str1, const char* str2)
{
if (str1 == NULL || str2 == NULL)
{
return NULL;
}
char* pbak = str1;
while (pbak != ‘\0’)
{
int flag = 1;
char
pfind = pbak;
char* psub = str2;
while (*psub != ‘\0’)
{
if (*psub != *pfind)//提前结束
{
flag = 0;
break;
}
psub++;
pfind++;
}
if (flag)
{
printf(“找到”);
return pbak;
}
else
{
printf(“未找到”);
}
pbak++;
}

}
char* mystrstr(const char* str1, const char* str2)
{
if (str1 == NULL || str2 == NULL)
{
return NULL;
}
int longLength = strlen(str1);
int subLength = strlen(str2);

int length = longLength - subLength;
//printf("length:%d",length);
char *pdes = NULL;
for (int i = 0; i < length; i++)
{
	int flag = 1;
	for (int j = 0; j < subLength; j++)
	{
		if (str2[j] != str1[i+j])
		{
			flag = 0;
			break;
		}
	}
	if (flag)
	{
		printf("找到地址!");
		pdes = str1 + i;
		return pdes;
	}
	else
	{
		printf("未找到!");
	}
}

}

Strset

将字符串以指定的字符串替代
Char* p = (char[10]){0};
_strset(p,’a’);
Setrev
char* mystrrev(char* str1)
{
int length = strlen(str1);
for (int i = 0; i < length / 2; i++)
{
char ch = str1[i];
str1[i] = str1[length - 1 - i];
str1[length - 1 - i] = ch;
}
return str1;
}

字符串大小写转换lwr/upr

字符串二级指针

字符串数组

Str与int转换

void main1()
{
char str[10] = “12345”;
char strnew[20];
int num = atoi(str);//字符串转换为实数
printf("%d\n", num);

int num1 = 47477;
_itoa(num1, strnew, 10);
printf("%s", strnew);
system("pause");

}

Atof

double myatof(char str)
{
double da = 0.0;
char
p = str;
while (*p != ‘\0’)//入口检查
{
if ((*p > ‘9’ || *p < ‘0’) && *p != ‘-’ && *p != ‘+’ && *p != ‘.’)
{
return da;//异常字符
}
p++;
}
//检查第一个位置是否为符号位
double fh = 1.0;
if (*str == ‘-’)
{
fh *= -1;
str++;
}
else if (*str == ‘+’)
{
str++;
}
//整数部分
while (*str != ‘.’)
{
da *= 10;
da += *str - ‘0’;
str++;
}
//小数部分
str++;
double xiaoshu = 1.0;
while (str != ‘\0’)
{
xiaoshu /= 10;
da += xiaoshu
(str - ‘0’);
str++;
}
return da
fh;
}
void main2()
{
char str[10] = “123.456”;
double db = myatof(str);
printf("%f", db);

system("pause");

}

Ftoa

char * ftoa(double db, char *str)
{
//- 123 . 456
char *istr = str;//备份首地址
//1. 符号
if (db < 0)
{
*str = ‘-’;
str++;
db = db * -1;
}
//2.整数
int wei=0;
int num = (int)db;
for (int inum = num; inum; inum/=10)
{
wei++;
}
for (int i = wei - 1; i >= 0; i–)
{
str[i] = num % 10 + ‘0’;
num = num / 10;
}
str[wei] = ‘\0’;
str+=wei;
*str = ‘.’;

double xiaoshu = db - (int)db;
//printf("小数是:%f\n", xiaoshu);
int xiaoshuwei = 0;
//取出小数位

for (double ixiaoshu = xiaoshu; abs((int)ixiaoshu - ixiaoshu) < ; ixiaoshu *= 10)
{
	xiaoshuwei++;
	//printf("%d %d\n", (int)ixiaoshu, ixiaoshu);
	//printf("小数位:%d\n", xiaoshuwei);
}
printf("小数位:%d\n",xiaoshuwei);
for (int i = 0; i < xiaoshuwei; i++)
{
	xiaoshu *= 10;
}
for (int i = 0; i < xiaoshuwei; i++)
{
	int data = (int) xiaoshu * 10;
	xiaoshu = data - (int)data;
	*str = data + '0';
	str++;
}
return istr;

}

可变参数mprintf实现

include<stdlib.h>
#include<stdio.h>
#include<stdarg.h>
void myprintf(char* ptstr, …)
{
va_list ap;//起始点
va_start(ap, ptstr);//从ap开始读取ptstr
char flag;
while (*ptstr)
{
flag = ptstr;//取出字符
if(flag!=’%’)
{
putchar(flag);
}
else
{
ptstr++;//跳过%
flag = ptstr;//获取%d,%s,%f,%p
switch (flag)
{
case ‘d’:
{
int data = va_arg(ap, int);//读取下一个参数按照int
printf("%d", data);//将int转换为str显示
break;
}
case ‘s’:
{
char
str = va_arg(ap, char
);//读取下一个参数按照int
printf("%s", str);//将int转换为str显示
break;
}
case ‘c’:
{
char cc = va_arg(ap, char);//读取下一个参数按照int
printf("%c", cc);//将int转换为str显示
break;
}
default:
break;
}
}
ptstr++;
}
}
void main()
{

myprintf("\n124qiao");
myprintf("\n124qiao%d",10);
myprintf("\n124qiao%d%s%c", 10,"qiqoqiao",'A');

system("pause");

}

Strcpy/strchr/strcat/strcat

宽字符函数

Strcmpi

比较字符串的大小,不区分大小写

/strncmp

比较前n个字符大小,strncmp(str1, str2, 8);//str1和str2是指针
其中_strnicmp是忽略大小写

stricmp/strnicmp

删除空格及加减法

乘除法

括号

删除多个重复字符与字符串

字符串切割

字符穿sprintf

Str基础函数

Strerror

Strtodtol

字符串转换

字符串插入

字符串替换全部

字符串寻找最长字符串

定义

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

char str[100] = “calc”;//栈上开辟存储区域
char *p1 = (char[]) {‘m’,‘s’,‘p’,‘a’,‘i’,‘n’,‘t’,’\0’};//数组的形式,存储在堆上
char *p2 = “notepad”;//notepad在代码区,p2存储代码区的地址,此部分无法做修改
void main1()
{
*str = ‘A’;
printf("%s\n", str);

*p1 = 'X';
printf("%s\n", p1);//p1是一个数组,所以如果要输出整个数组
*p2 = 'X';
printf("%s\n", p2);
system("pause");

}
void main2()
{
char str1[100] = “qaioxiaolei”;
printf("%d\n", sizeof(str1));
printf("%d\n", strlen(str1));
//strlen计算字符串的长度,以’\0’为字符串结束标志
//sizeof是分配的数组实际所占的内存空间大小,不受里面存储内容
system(“pause”);
}
void main3()
{
char str[5] = { ‘a’, ‘b’,‘c’,‘d’,‘e’ };
printf("%s", str);//批量显示必须要有’\0’,单字符显示不需要
for (int i = 0; i < 5; i++)
{
putchar(str[i]);
}
system(“pause”);
}
void main()
{
char *str = “iloveyou”;
printf("%s\n",str+3);//改变指针的位置输出不同的字符

system("pause");

}
字符串初始化:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
char str[5][20] = { “calc”, “notepad”,“mspaint”,“tasklist”,“pause” };
//存储的是字符串
str[0][0] = ‘X’;//*str[0] = ‘X’;
char *p[5] = { “calc”, “notepad”,“mspaint”,“tasklist”,“pause” };
//存储的是指针,指针数组
for (int i = 0; i < 5; i++)
{
printf("%s %s\n", str[i], p[i]);
}
system(“pause”);
}

字符串与字符数组的关系

字符串用一维字符串数组存放
字符串具有一维数组的所有特点
数组名是指向数组首地址的地址常量
数组元素的引用方法可用指针和下标法
数组名做函数参数是地址传递等
区别
存储格式:字符串结束标志
赋值方式与初始化
输入输出方式: %c %s
字符指针变量和字符数组
字符指针变量是指向字符的首地址,字符数组是是存储多个元素
Char *p char str[100]
right: char *p; p =”2020 加油哦”;
error:char str[20];str = ”2020 加油哦”;
str是地址常量,而p是地址变量
p输入字符串的话(scanf),必须先开辟存储空间(其实可以理解为需要先确定地址,因为指针可以指向代码区或者栈区,写入的时候需要先明确是什么区域):
char *p,str[10];
p = str;//常量地址赋给变量地址
scanf(“%s”,cp);
{‘a’,‘b’,‘c’,‘d’}与“abcd”区别:末尾的\0

  1. 用指针可以代替一个格式字符串char *format; format = “a = %d, b=%d\n”; printf(format,a,b);

C++语法概览

C语言相当于是内功,而C++相当于是外功。C++很多事对c语言语法的封装。
多线程(2),

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值