数组不能作为入口参数传给函数
只能上传地址
//例如
int func(int a) // 接收数组a
{return a;
}
int main()
{int a[3] = {1, 2, 3 };
func(a); // 上传数组a
}
上述情况会报错
只能通过上传地址的方式来上传数组
// 例如
int func(int *a)
int func(int a[]) //两种方式等价
相对应的
// 例如
(*p+i)=2;
p[i] = 2; //两者也等价
//例如
#include#include#includeusing namespace std;
void func(int a[])
{for (int i = 0;i< 3;i++)
{a[i] = 10;
}
}
int main()
{int a[3] = {1, 2, 3 };
func(&a[0]); // 注意此处写成&a[0]也可以,表示指针放在0位
for (int i = 0;i< 3;i++)
{cout<< a[i]<< " ";
}
}
函数内部函数函数内部函数只能在函数内部使用,在函数完成之后就被销毁
从外部调用时非法的
//例如
#include#include#includeusing namespace std;
int* func(int a,int b) //返回指针类型的
{int c = a + b;
return &c; // c是地址
}
int main()
{int a = 3;
int b = 4;
int *d = func(a,b); // 用*d来接受
cout<< *d; // 输出d
}
以上情况尽管可以运行,但是是非法的
不可以对函数内部变量内存进行操作
函数内部变量的内存地址不可随便输出
不可以输出一个访问函数内部变量的引用
容易发生崩溃及程序错乱
单引号为字符类型
双引号为字符串类型
字符串存储在数组中;
需要提前开辟一块足够大的内存空间;
存储字符串的数组的大小要大于字符串长度+1;
存储三个字符串abc的数组a[3]是不够的,需要至少四个;
//字符串的两种创建形式
int main()
{char a[4] = "abc";
const char *p = "123";
}
字符串结尾\0之所以说一个"abc"字符串需要至少四个空间,是因为字符串的结尾都是用‘\0’来表示的,所有字符串的结尾都认为有一个‘\0’,不会显示出来
注意,‘\0’一定是单引号!
//例如
#include#include#includeusing namespace std;
int main()
{char a[4] = "abc";
cout<< a[3]<< "\n"; // "abc"索引只到2,但是输出索引3不会报错,但是输出结果什么也没有
cout<< (int)a[3]; // 强制类型转换,如果转换成数字,会发现是0
}
//显示
0
//例如
int main()
{char a[100] = "apple";
a[3] = '\0'; //在索引为3也就是,l的位置重新赋值为'\0'
cout<< a<< "\n";
cout<< a[4]; // 字符串虽然被截断,但是截断后面的字符串还是可以索引到
}
//显示
app //结果只显示'\0'之前的,表示在'\0'就停止了
e //截断后面的字符串还是可以索引到
声明的时候手动添加’\0’
/例如
int main()
{char a[100] = "app\0le";
cout<< a<< "\n";
cout<< a[4];
}
//显示
app //可以看到,在声明的时候,如果加入了'\0',则系统认为该字符串在此处停止
l // 但是后面的字符串还是能够索引得到
计算字符串长度//例如
int len(char a[]) //注意此处上传char a[],不是int a[]
{int i = 0;
for (;a[i] != '\0';i++) //循环,在a[i] == '\0'处结束,
{ }
return i;
}
int main()
{char a[100] = "apple";
int x = len(a);
cout<< x ;
}
//显示
5
字符串拼接//例如
int len(char a[]) // 求长度
{int i = 0;
for (;a[i] != '\0';i++)
{}
return i;
}
void sp(char a[], char b[],char outc[]) //字符串拼接
{int i, j;
for (i = 0;a[i] != '\0';i++)
{outc[i] = a[i];
}
for (j = 0;b[j] != '\0';j++)
{outc[j + i] = b[j];
}
outc[i + j] = '\0';
}
int main()
{char a[100] = "apple";
char b[100] = "orange";
char c[100];
sp(a, b, c);
cout<< c<< "\n";
int x = len(c);
cout<< x ;
}
//显示
appleorange
11
字符串函数需要在前面加声明,才能使用这些函数
#define _CRT_SECURE_NO_WARNINGS
strcatstrcat(a,b):可以将字符串a和字符串b拼接起来,返回一个指向返回值的指针
//例如
int main()
{char a[100] = "apple";
char b[100] = "orange";
char *p;
p = strcat(a, b); //返回值是个指针
cout<< p;
}
//显示
appleorange
strcpychar * strcpy(char * strDest,const char * strSrc);将const char * strSrc(源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串),复制到char * strDest(目标字符串的首地址)中去,返回的是目标字符串的首地址
strcpy(a,b)将b的值拷贝到a中,会将a的值覆盖
//例如
int main()
{char a[100] = "apple";
char b[100] = "orange";
char c[100] = "a";
char *p;
p = strcpy(a, c);
cout<< p<<"\n";
cout<< a;
}
//显示
a // 覆盖掉a原来的值
a // 输出a,发现也是一样
strcmpextern int strcmp(const char *s1,const char *s2);
strcmp(a,b)比较两个字符串,如果a=b则返回0,a>b,则返回正数,a//例如
int main()
{char c[100] = "a";
char d[100] = "b";
char e[100] = "c";
char *p;
int m = strcmp(c, d);
int n = strcmp(e, c);
cout<< m<<"\n";
cout<< n<< "\n";
cout<< strcmp(c, c)<< "\n";
}
strlen//显示
-1 //右大于左
1 //左大于右
0 //字符串相同
strlen(a);返回字符串长度;
//例如
int main()
{char a[100] = "apple";
int x = strlen(a);
cout<< x<< "\n";
}
/显示
5
大小写转换//例如
void change(char *a)
{for (int i = 0;a[i] != '\0';i++)
{if (a[i] >='a' &&a[i]<='z')
{ a[i] = a[i] - 'a' + 'A';
}
else if (a[i] >='A' &&a[i]<='Z')
{ a[i] = a[i] - 'A' + 'a';
}
}
}
int main()
{char a[100] = "apPlE";
change(a);
for (int i = 0;a[i] != '\0';i++)
{cout<< a[i];
}
//显示
APpLe
字符串变成数字
手写//例如
int sTi(char* a)
{int n;
int res = 0;
int mi = 1;
for (n = 0;a[n] != '\0';n++)
{}
// n就是字符串长度
for (int i = n - 1;i >= 0;i--)
{res += (a[i] - '0') * mi;
mi = mi * 10;
}
return res;
}
int main()
{char a[100] = "315426";
int d = sTi(a);
cout<< d;
// 显示
315426
函数atoi和atofatoi:将字符串转换成为数字,整型;
atof:将字符串转换成为数字,浮点型;
//例如
int main()
{char a[100] = "315426";
int d = atoi(a);
float e = atof(a);
cout<< d<< "\n";
cout<< e;
}
数字转字符串//例如
void iTs(int a, char* res)
{int x[100];
int m = 0;
while (a != 0) //用while循环得到长度和数组倒序数组
{int b = a % 10;
a = a / 10;
x[m] = b;
m += 1;
}
for (int i = 0;i< m;i++) //将倒序数组倒序放到字符串中去
{res[m - 1 - i] = '0' + x[i];
}
res[m] = '\0';
}
int main()
{int a = 13546;
char res[100];
iTs(a, res);
//cout<< m;
for (int i = 0;res[i] != '\0';i++)
{cout<
//显示
13546
string前面需要声明
#includeusing namespace std;
利用string变量可以实现字符串相加
//例如
int main()
{string s = "abc"; //声明成为string变量可以直接实现字符串拼接
string a = "123";
cout<< s + a;
}
//显示
abc123
例题有一个字符串 “I am a good boy. I like sports.”,找出其中出现次数最多的字母,并且输出它的出现次数
//例如
void FindMostTimesChar(char* pIn, char& outChar, int& outTimes)
{//一个数组初始化为0
int x[200];
for (int i = 0; i< 200; i++)
{x[i] = 0;
}
// 将大写字母和小写字母的出现次数存放在数组中
for (int i = 0;pIn[i] != '\0';i++)
{if (pIn[i] >= 'a' && pIn[i]<= 'z')
{ int q = pIn[i] - 'a'; //数组x的索引0-25存小写字母;
x[q] += 1;
}
else if (pIn[i] >= 'A' && pIn[i]<= 'Z')
{ int q = pIn[i] - 'A'; //数组x的索引26-51存大写字母出现次数;
x[q + 26] += 1;
}
}
//找到大值,也就是出现次数最多的字母的索引和次数
int maxnum = 0; // 大出现的次数
int maxid = 0; // 对应的索引,也就是是哪个字母
for (int i = 0;i< 52;i++)
{if (x[i] >maxnum)
{ maxnum = x[i];
maxid = i;
}
}
//按照规则还原成字母和次数
if (maxid >25)
{outChar = 'A' + (maxid - 26);
outTimes = maxnum;
}
else if (maxid< 25)
{outChar = 'a' + maxid;
outTimes = maxnum;
}
}
int main()
{char a[100] = "I am a good boy. I like sports.";
char res;
int num;
FindMostTimesChar(a, res, num);
cout<< res<< " "<< num;
}
//显示
o 4
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧