真的,我不相信有人会看完这个。。。。。。。。。。。。。。。。。。。如果你真的看完了,字符串就基本入门了

题目描述

写一函数,将两个字符串连接

输入

两行字符串

输出

链接后的字符串

样例输入

copy
123
abc

样例输出

123abc
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a,b;
    cin>>a>>b;
    a+=b;
    cout<<a;
}

题目描述

写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。

输入

一行字符

输出

逆序后的字符串

样例输入

copy
123456abcdef

样例输出

fedcba654321
#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a;
	cin >> a;
	reverse(a.begin(), a.end());
	cout << a;
}

题目描述

编写程序,判断输入的一个字符串是否为回文。若是则输出“Yes”,否则输出“No”。所谓回文是指順读和倒读都是一样的字符串。

样例输入

copy
abcddcba

样例输出

Yes
#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a,b;
	cin >> a;
	b=a;
	reverse(a.begin(), a.end());
	if (a == b)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
}

题目描述

将字符串t插入到字符串s中,在位置pos后插入。不得使用字符串操作函数,输出组合成的字符串。

输入

输入两个字符串(t和s)和要插入的位置(pos)

输出

输出组合后的字符串

样例输入

copy
qwe
jij
3

样例输出

jijqwe
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int pos;
    string t,s;
    cin>>t>>s;
    cin>>pos;
    s.insert(s.begin()+pos,t.begin(),t.end());
    cout<<s;
}

题目描述

一个字符串,存放在一个数组中,编程序将其改造之后输出:

(1)将S的所有第偶数个字符按照从大到小的次序放在S的后半部分;

(2)将S的所有第奇数个字符按照从小到大的次序放在S的前半部分;

输入

输入一个字符串

输出

输出改造后的字符串

样例输入

copy
ABCDEFGHIJKL

样例输出

ACEGIKLJHFDB
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
char a[101],b[101],c[101];
bool cmp(char a,char b)
{
    return a>b;
}
int main()
{
    gets(a);
    int len=strlen(a);
    int k=0;
    for(int i=0;i<len;i+=2)
        c[k++]=a[i];
        c[k]='\0';///奇数
    int j=0;
    for(int i=1;i<len;i+=2)
       b[j++]=a[i];
       b[j]='\0';///偶数
       sort(c,c+k);
       printf("%s",c);
       sort(b,b+j,cmp);
       printf("%s",b);
}

题目描述

从一个字符串中的第p个位置起删除指定长度的字符串,输出最终结果,若输入不合法,则输出 Illegal input

输入

输入一个字符串s、位置p、长度n

输出

删除子串后的字符串

样例输入

copy
adfasdf12
6 5

样例输出

Illegal input
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a;
    int p,n;
    cin>>a>>p>>n;
    if(p+n>a.length())
        cout<<"Illegal input";
    else
    {
        a.erase(p-1,n);
        cout<<a;
    }
}

题目描述

编写一个C程序实现将字符串中的所有"you"替换成"we"

输入

输入包含多行数据 

每行数据是一个字符串,长度不超过1000


数据以EOF结束

输出

对于输入的每一行,输出替换后的字符串

样例输入

copy
you are what you do

样例输出

we are what we do
#include<stdio.h>
char a[1001];
int main()
{
    gets(a);
    for(int i=0;a[i]!='\0';i++)
    {
        if(a[i]=='y'&&a[i+1]=='o'&&a[i+2]=='u')
        {
            a[i]='w';
            a[i+1]='e';
            a[i+2]='p';
        }
    }
    for(int i=0;a[i]!='\0';i++)
    {
            if(a[i]=='p')
            continue;
        printf("%c",a[i]);
    }
}

题目描述

输入一长度为n的字符串,若其n为偶数,则将字符串从中间反转,若为奇数,则将前后各(n-1)/2个字符反转,中间字符不动。

样例输入

asdfghjkl qwerty

样例输出

fdsaglkjh
ewqytr
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a;
    while(cin>>a)
    {
        int len=a.length();
        reverse(a.begin(),a.begin()+len/2);
        if(len&1)///奇数长度
        reverse(a.begin()+len/2+1,a.end());
        else
        reverse(a.begin()+len/2,a.end());
        cout<<a<<endl;
    }
}

题目描述

输入一行字符串(只包含字母),截取最后一位放首位,然后其它的取每一位给asc码+3 。测试数据有多组,一次性输入与输出。

样例输入

copy
asdf

awxz

样例输出

fdvg

zdz{
#include<stdio.h>
#include<string.h>
char a[11];
int main()
{
    while(gets(a))
    {
      int len=strlen(a);
      int c=a[len-1];
      for(int i=len-1;i>0;i--)
      a[i]=a[i-1]+3;
          a[0]=c;
          puts(a);
    }
}

1064: 输入三个字符串,按由小到大的顺序输出

时间限制: 1 Sec  内存限制: 128 MB
提交: 1261  解决: 558
[提交][状态][讨论版][命题人:外部导入]

题目描述

输入三个字符串,按由小到大的顺序输出。分别使用指针和引用方式实现两个排序函数。在主函数中输入和输出数据。

输入

3行字符串

输出

按照从小到大输出成3行。由指针方式实现。

按照从小到大输出成3行。由引用方式实现。

样例输入

copy
cde
afg
abc

样例输出

abc
afg
cde
abc
afg
cde

提示

 主函数已给定如下,提交时不需要包含下述主函数

/* C++代码 */

int main()

{

    void sort1(char *,char *,char *);

    void sort2(string &,string &,string &);

    char s1[100],s2[100],s3[100];

    char *p1,*p2,*p3;

    string r1,r2,r3;

    cin>>s1>>s2>>s3;

    r1=string(s1);

    r2=string(s2);

    r3=string(s3);

    p1=s1;

    p2=s2;

    p3=s3;

    sort1(p1,p2,p3);

    cout<<s1<<endl<<s2<<endl<<s3<<endl;

    sort2(r1,r2,r3);

    cout<<r1<<endl<<r2<<endl<<r3<<endl;

    return 0;

}

来源

freeproblemset edit by lyh 

#include<bits/stdc++.h>
using namespace std;
void sort1(char *p1,char *p2,char *p3)//指针
{
    char a[101];///需要中间变量的字符串数组
    if(strcmp(p1,p2)>0)
        strcpy(a,p1),strcpy(p1,p2),strcpy(p2,a);
    if(strcmp(p1,p3)>0)
        strcpy(a,p1),strcpy(p1,p3),strcpy(p3,a);
    if(strcmp(p2,p3)>0)
        strcpy(a,p2),strcpy(p2,p3),strcpy(p3,a);
}
void sort2(string &r1,string &r2,string &r3)
{///引用字符串
    string t;
    if(r1>r2)
     swap(r1,r2);
    if(r1>r3)
        swap(r1,r3);
    if(r2>r3)
        swap(r2,r3);
}

1068: 复制字符串

时间限制: 1 Sec  内存限制: 128 MB
提交: 1688  解决: 856
[提交][状态][讨论版][命题人:外部导入]

题目描述

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

输入

数字n 一行字符串数字m

输出

从m开始的子串

样例输入

copy
6
abcdef
3

样例输出

cdef

提示

 主函数已给定如下,提交时不需要包含下述主函数

/* C代码 */

int main()

{

    char s1[256],s2[256];

    int n,pos,i;

    scanf("%d",&n);

    getchar();

    for(i=0;i<n;i++)

       scanf("%c",&s1[i]);

    s1[n]='\0';

    scanf("%d",&pos);

    strcpypos(s2,s1,pos);

    printf("%s\n",s2);

    return 0;

}

/* C++代码 */

int main()

{

    char s1[256],s2[256];

    int n,pos,i;

    cin>>n;

    cin.get();

    cin.getline(s1,n+1);

    cin>>pos;

    strcpypos(s2,s1,pos);

    cout<<s2<<endl;

    return 0;

}

来源

freeproblemset edit by lyh 

#include<iostream>
#include<string.h>
using namespace std;
void strcpypos(char s2[],char s1[],int pos)
{
	int i,j=0;
	for(i=pos-1;s1[i]!='\0';i++)
	{
		s2[j]=s1[i];
		j++;
	}
}

1097: 字符串的输入输出处理

时间限制: 1 Sec  内存限制: 64 MB
提交: 352  解决: 85
[提交][状态][讨论版][命题人:外部导入]

题目描述

字符串的输入输出处理。

输入

第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。

输出

先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。

样例输入

copy
2
www.njupt.edu.cn NUPT
A C M
N U P Ter

样例输出

www.njupt.edu.cn NUPT

A C M

N

U

P

Ter

来源

freeproblemset 

#include<iostream>
#include<string.h>
using namespace std;
char a[1002];
int main()
{
	int n;
	cin>>n;
	getchar();
	while(n--)
	{
		gets(a);
		puts(a);
		cout<<endl;
	}
	while(gets(a))
	{
		for(int i=0;a[i]!='\0';i++)
		{
			if(a[i]==' ')
			cout<<endl<<endl;
			else
			cout<<a[i];
		}
		cout<<endl<<endl;
    }	
}

3276: 字符串比较

时间限制: 1 Sec  内存限制: 128 MB
提交: 69  解决: 16
[提交][状态][讨论版][命题人:外部导入]

题目描述

给定三个字符串,输出其中最大者。

输入

三个长短不定的字符串。

输出

比较并输出最大的字符串。

样例输入

copy
A
abc
hxl

样例输出

hxl

提示

注意:比较大小应按照ASCII码进行排序,而不是长度。 

#include<iostream>
#include<string.h>
using namespace std;
char a[100001],b[1000001];
int main()
{
	gets(a);
	for(int i=0;i<2;i++)
	{
		gets(b);
		if(strcmp(b,a)>0)
		strcpy(a,b);
	}
	cout<<a;
}

3259: 2.字符串处理

时间限制: 1 Sec  内存限制: 128 MB
提交: 315  解决: 149
[提交][状态][讨论版][命题人:lyh]

题目描述

字符串处理,输出字符串不重复字符的数目。

输入

输入字符串(字符总数小于50)

输出

不相同字符的个数

样例输入

copy
abca

样例输出

3
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char a[101];
int main()
{
	gets(a);
	int len=strlen(a);
	sort(a,a+len);
	int c=len;
	for(int i=0;i<c;i++)
	{
		if(a[i]==a[i+1])
		len--;
	}
	cout<<len;
}

2760: 字符串---首字母变大写

时间限制: 1 Sec  内存限制: 128 MB
提交: 1192  解决: 522
[提交][状态][讨论版][命题人:smallgyy]

题目描述

输入一行英文句子,将每个单词的第一个字母改成大写字母。

输入

一个长度不超过100的英文句子

输出

将原先句子中单词的第一个字母改成大写字母输出

样例输入

copy
i want to get an accepted

样例输出

I Want To Get An Accepted

来源

gyy gyy 

[提交][状态]

#include<iostream>
using namespace std;
char a[101];
int main()
{
	gets(a);
	for(int i=0;a[i]!='\0';i++)
	{
		if(i==0&&a[0]!=' ')
		a[0]-=32;
		if(a[i]>='a'&&a[i]<='z'&&a[i-1]==' ')
		a[i]-=32;
	}
	cout<<a;
}

2415: C语言习题 输出A打头的字符串

时间限制: 1 Sec  内存限制: 128 MB
提交: 673  解决: 488
[提交][状态][讨论版][命题人:lyh]

题目描述

输出n个字符串,把其中以字母A打头的字符串输出。

输入

第一行 n

第二行到第n+1行,每行一个字符串

输出

A打头的字符串

样例输入

copy
3
Ada
Bob
Alice

样例输出

Ada
Alice

来源

lyh 

[提交][状态]

#include<iostream>
using namespace std;
string a[11];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	for(int i=0;i<n;i++)
	if(a[i][0]=='A')
	cout<<a[i]<<endl;
}

2284: 将字符串格式化后输出(串)

时间限制: 1 Sec  内存限制: 128 MB
提交: 107  解决: 80
[提交][状态][讨论版][命题人:外部导入]

题目描述

输入一个字符串,将其按给定的长度n格式化并输出,若n=0,则输出原字符串

输入

输入一个字符串

输出

格式化并输出

样例输入

copy
asdfasdf
3

样例输出

asd
fas
df
#include<iostream>
#include<string.h>
using namespace std;
char a[101];
int main()
{
	int n;
	gets(a);
	cin>>n;
	if(n==0)
	puts(a);
	else
	{
		for(int i=0;a[i]!='\0';i++)
		{
			cout<<a[i];
			if((i+1)%n==0)
			cout<<endl;
		}
	}
}

2781: 重复字符串

时间限制: 1 Sec  内存限制: 128 MB
提交: 364  解决: 232
[提交][状态][讨论版][命题人:helijian_teacher]

题目描述

输入一个字符串,将其重复若干次,例如,输入goal和5,得到的就是球迷的欢呼:goalgoalgoalgoalgoal。

不急着欢呼,先补充完整下面的程序。还需要注意的是,给出的程序段中,还藏着一个小Bug,需要你将其改过来。

#include <iostream>
#include <cstdio>
using namespace std;
void strcopy(char*,char*,int);
int main( )
{
     char str1[80];
     char str2[80];
     int n;
     gets(str1);
     cin>>n;
     strcopy(str2,str1,4);
     cout<<str2<<endl;
     return 0;
}

输入

一个待重复的字符串
重复的次数

输出

重复后的文字

样例输入

copy
goal
5

样例输出

goalgoalgoalgoalgoal

提示

 提交全部代码

来源

hlj 

#include<iostream>
#include<cstdio>
using namespace std;
void strcopy(char str2[],char str1[],int n)
{
   int j=0,i,k;
   for(i=0;i<n;i++)
   {
   	   k=0;
       while(str1[k]!='\0')
	   {
	   	  str2[j++]=str1[k++];
   	   }   	
   }	
   str2[j]='\0';
}
void strcopy(char*,char*,int);
int main( )
{
     char str1[80];
     char str2[80];
     int n;
     gets(str1);
     cin>>n;
     strcopy(str2,str1,n);
     cout<<str2<<endl;
     return 0;
}

2426: C语言习题 字符串排序

时间限制: 1 Sec  内存限制: 128 MB
提交: 1290  解决: 732
[提交][状态][讨论版][命题人:lyh]

题目描述

用指向指针的指针的方法对5个字符串排序并输出。要求将排序单独写成一个函数。字符串和n在主函数中输入。最后在主函数中输出。

输入

n和n个字符串

输出

排序后的字符串

样例输入

copy
5
12345
123
abce
abcde
abcd

样例输出

123
12345
abcd
abcde
abce

提示

/* C代码 */

int main()

{

    void sort(char **,int );

    int i,n;

    char **p,*pstr[20],str[20][80];

    scanf("%d",&n);

    for (i=0; i<n; i++)

        pstr[i]=str[i];

    for (i=0; i<n; i++)

        scanf("%s",pstr[i]);

    p=pstr;

    sort(p,n);

    for (i=0; i<n; i++)

        printf("%s\n",pstr[i]);

    return 0;

}

/* C++代码 */

int main()

{

    void sort(char **,int );

    int i,n;

    char **p,*pstr[20],str[20][80];

cin>>n;

    for (i=0; i<n; i++)

        pstr[i]=str[i];

    for (i=0; i<n; i++)

        cin>>pstr[i];

    p=pstr;

    sort(p,n);

    for (i=0; i<n; i++)

        cout<<pstr[i]<<endl;

    return 0;

}

来源

lyh 

#include<iostream>
#include<string.h>
using namespace std;
void sort(char **p,int n)
{
    char *temp;
    for (int i=0; i<n; i++)
    {
        for (int j=i+1; j<n; j++)
        {
            if (strcmp(*(p+i),*(p+j))>0)
            {
                temp=*(p+i);
                *(p+i)=*(p+j);
                *(p+j)=temp;
            }
        }
    }
}

2806: 将整数转换成字符串。

时间限制: 1 Sec  内存限制: 128 MB
提交: 549  解决: 300
[提交][状态][讨论版][命题人:touming]

题目描述

用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数。提交函数convert即可。

输入

一个整数。

输出

对应的字符串。

样例输入

copy
483

样例输出

483

提示

#include <iostream>

using namespace std;

int main()

{void convert(int n);

 int number;

 cin>>number;

 if (number<0)

   number=-number;       

   convert(number);

  return 0;}

void convert(int n)
{
	if(int i=n/10)
		convert(i);
	putchar(n%10+'0');
}

2874: 包含B的字符串

时间限制: 1 Sec  内存限制: 128 MB
提交: 226  解决: 153
[提交][状态][讨论版][命题人:helijian_teacher]

题目描述

输出n个字符串,把其中以包含字母B或b的字符串输出。

输入

第一行 n
第二行到第n+1行,每行一个字符串

输出

包含字母B或b的字符串

样例输入

copy
6
Ada
Bob
Tom
Brown
Jobs
Alice

样例输出

Bob
Brown
Jobs

来源

hlj 

#include<iostream>
using namespace std;
char a[101];
int main()
{
	int n;
	cin>>n;
	getchar();
	for(int i=0;i<n;i++)
	{
		gets(a);
		int count=0;
		for(int j=0;a[j]!='\0';j++)
		{
			if(a[j]=='B'||a[j]=='b')
			{
				count=1;
				break;
			}
		}
		if(count)
		cout<<a<<endl;
	}
}

2414: C语言习题 字符串排序

时间限制: 1 Sec  内存限制: 128 MB
提交: 1143  解决: 578
[提交][状态][讨论版][命题人:lyh]

题目描述

输入n个字符串,将它们按字母由小到大的顺序排列并输出。编写三个函数实现,input 用于输出n个字符串,sortstr用于排序n个字符串,output 用于输出n个字符串。

输入

第一行 n

第二行到第n+1行,每行一个字符串

输出

排序后的字符串

样例输入

copy
3
YTU
ACM
COM

样例输出

ACM
COM
YTU

提示

 主函数已给定如下,提交时不需要包含下述主函数

/* C++代码 */

int main()

{

   string str[10];

   int n;

   cin>>n;

   input( str, n);

   sortstr( str, n);

   output( str, n);

   return 0;

}

来源

lyh 

[提交][状态]

#include<bits/stdc++.h>
#include <iostream>
using namespace std;
void input(string str[],int n)
{
    for(int i=0;i<n;i++)
        cin>>str[i];
}
void sortstr(string str[],int n)
{
    sort(str,str+n);
}
void output(string str[],int n)
{
    for(int i=0;i<n;i++)
        cout<<str[i]<<endl;
}

3222: C语言习题 字符串比较—C语言版

时间限制: 1 Sec  内存限制: 128 MB
提交: 447  解决: 221
[提交][状态][讨论版][命题人:smallgyy]

题目描述

写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为
int stringcmp(char *p1,char *p2); 
设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0,若s1≠s2,返回它们二者第1个不同字符的ASCII码差值(如"BOY"与"BAD",第2个字母不同,"O"与"A"之差为79-65=14)。如果s1>s2,则输出正值,如s1<s2,则输出负值。 

输入

两个字符串 

输出

比较结果 

样例输入

copy
BOY
BAD

样例输出

14

提示


主函数已给定如下,提交时不需要包含下述主函数

 


#include<stdio.h> 

int main()

{

    int stringcmp(char *,char *);

    int m;

    char str1[80],str2[80],*p1,*p2;

    gets(str1);

    gets(str2);

    p1=&str1[0];

    p2=&str2[0];

    m=stringcmp(p1,p2);

    printf("%d\n",m);

    return 0;

}
 

int stringcmp(char *p1, char *p2)
{
	while (*p1 || *p2)
	{
		if (*p1 != *p2)
			return(*p1 - *p2);
		else
		{
			p1++;
			p2++;
		}
	}
	return 0;
}

2260: 字符串的排列(栈和队列)

时间限制: 1 Sec  内存限制: 1000 MB
提交: 13  解决: 7
[提交][状态][讨论版][命题人:外部导入]

题目描述

题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串
abc、acb、bac、bca、cab和cba。

输入

输入:

abc

输出

输出:

abc acb bac bca cab cba

样例输入

copy
abc

样例输出

abc acb bac bca cab cba

来源

[提交][状态]

#include<bits/stdc++.h>
using namespace std;
char a[11];
int main()
{
    gets(a);
    int len=strlen(a);
    do
    {
        for(int i=0; i<len; i++)
        cout<<a[i];
        cout<<" ";
    }
    while(next_permutation(a,a+len));
}

2262: 在字符串中删除特定的字符(栈和队列)

时间限制: 1 Sec  内存限制: 1000 MB
提交: 14  解决: 12
[提交][状态][讨论版][命题人:外部导入]

题目描述

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入”They are students.”和”aeiou”,
则删除之后的第一个字符串变成”Thy r stdnts.”。

输入

输入:

They are students.

aeiou

输出

输出:

Thy r stdnts.

样例输入

copy
They are students.
aeiou

样例输出

Thy r stdnts.

来源

[提交][状态]

#include<iostream>
#include<string.h>
using namespace std;
char a[101],b[101];
bool h[128];
int main()
{
	gets(a);
	gets(b);
	for(int i=0;b[i]!='\0';i++)
		h[b[i]]=true;
	for(int i=0;a[i]!='\0';i++)
	   if(h[a[i]]==false)
	   cout<<a[i];
}

2809: 使用指针连接字符串。

时间限制: 1 Sec  内存限制: 128 MB
提交: 313  解决: 172
[提交][状态][讨论版][命题人:touming]

题目描述

编写函数stringcat,实现字符串的连接,程序中需要使用指针形式访问字符串。提交函数部分即可。

输入

程序中给出的两个字符串。

输出

连接后的字符串。

样例输出

I love C++

提示

#include <iostream>

using namespace std;

char * stringcat(char *source, const char *dest)

{//将字符串dest的连接到字符串source的尾部

}

int main() {

char s1[30]="I love ";

char *s2="C++";

stringcat(s1,s2);

cout<<s1<<endl;

return 0;

}

来源

tanzheng 

[提交][状态]

	while (*source != '\0')
		source++;
	while (*dest != '\0')
		*source++ = *dest++;
	*source = '\0';

问题 O: 国家排序

时间限制: 1 Sec  内存限制: 128 MB
提交: 1270  解决: 787
[提交][状态][讨论版][命题人:helijian_teacher]

题目描述

世界格局动荡不安,10国紧急召开会议磋商对策。有些国家斤斤计较,参会代表的座位如何排定争个不停。现在给他们按字典序排列,赶紧商议正事。请编写程序,为这10国的代表排好顺序。

输入

10个国家的名字,一个国家一行

输出

排好序的国家名,一个国家一行

样例输入

copy
Ireland
Poland
Germany
France
Norway
Korea
Malaysia
Thailand
China
Brazil

样例输出

Brazil
China
France
Germany
Ireland
Korea
Malaysia
Norway
Poland
Thailand

提示

调试程序输入时,请用好DOS窗口左上角的“编辑”功能,以提高工作效率。

[提交][状态]

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    string a[11];
    for(int i=0;i<10;i++)
        cin>>a[i];
    sort(a,a+10);
    for(int i=0;i<10;i++)
    cout<<a[i]<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_43813697/article/details/89303402