------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 字符串输出
1) 以字符数组来存储字符串,输出时使用数组名以%s格式输出
printf(“%s\n”,str);str为字符数组名
2) 字符串从给定地址开始输出,遇到\0就停止
2. 字符串输入
1) 同样使用数组名来接收,使用%s格式scanf(“%s”,str);str为字符数组名
2) 使用%s来输入字符串,如果输入中有空格,则空格后的内容无效,也就是说遇到空格就再不接收输入
3. 字符串结束符的使用
注意:使用%s输出时,如果当前数组中只有多个字符,没有\0,则会打印出其他一些东西,知道遇到内存中的\0才停止,所以不安全。
4. 字符串长度计算方法
1) 通过字节数来判断
2) 使用字符串长度计算函数strlen();
5. 字符串处理函数
1) puts:输出一个字符串,puts(字符数组名),自动换行
① 必须是字符数组
② 可以不是数组首地址,也可以是某个元素的地址
③ 不能进行格式化输出
2) gets:输入一个字符串,
① 不安全,如果输入长度大于定义的字符数组的长度,也可以输出,不会报错
② 可以接收空格
3) strcat:连接字符串,要包含头文件string.h
① 格式为:strcat(oldstr,newstr)
② 把newstr连接到oldstr的后面
③ oldstr的长度要足够大,至少应该是oldstr和newstr长度之和,相当于newstr把oldstr中最后一个字符\0给覆盖了
4) strcpy字符串复拷贝函数
① strcpy(oldstr,newstr),用newstr覆盖掉oldstr,newstr内容不变
② oldstr长度足够大
5) strcmp:比较两个字符串的大小
① 格式为:strcmp(str1,str2)
② 对str1和str2中字符从左到右进行比较ascii码值,跟长度无关
③ str1大,结果为正数;str2大,结果为负数;相等结果为0.
6) strlen:计算字符串的长度,不包括\0,比如:char str[100]=”abcde”;
sizeof(str)的结果为100,而strlen(str)的结果为5.
6. 应用:字符串单词首字母大写以及统计单词个数
#include <stdio.h>
int main(int argc, const char* argv[]) {
//定义数组变量,以及标志变量和计数变量
int count = 0;
int word = 1;
char str[50];
//提示用户输入字符串
printf("请输入一个字符串:\n");
//接收字符串
gets(str);
//循环字符串,遇到\0结束
for (inti=0; str[i]!='\0'; i++) {
//判断
if(str[i] == ' ') {
//是空格的话改标记
word = 1;//表示假设下一个为单词首字母
}elseif(word == 1){
//当前是单词首字母
count++; //计数单词个数
str[i] = str[i]-32;//小写字母变大写
word = 0; //下一个不是单词首字母
}
}
printf("单词个数为:%d\n",count);
puts(str);
return0;
}
7. 指针:就是一个内存地址,是一个常量,通过地址来操作
1) 指针变量:用来存放指针的变量
① 指针变量类型要与指向的变量的类型相同
② 定义指针变量时一定要有 *
③ 指针变量不能用来存放数值或字符,只能存地址
④ 指针变量也具有全局性和局部性
8. 指针变量的初始化和使用
1) 先定义,然后初始化,再使用(使用指针变量对内存地址进行操作)
2) 指针变量不初始化有什么后果?
① 不初始化存放的是一个垃圾值,指针为野指针
② 一定要避免野指针int *p;值为垃圾值,有可能为存放的是系统程序的地址,*p=10;可能会把系统中某个空间的值改为10,可能会使系统崩溃
3) 指针变量如何进行初始化,使用地址进行初始化
① 定义的同时初始化
a. 完全初始化
int *p=&a;p指向了a;
int *p1=&a,*p2=&a;p1,p2都指向了a
b. 部分初始化
int *p1=&a,*p2; p2=&a;
② 先定义后初始化
③ 可以先定义一个指针变量而不用指向任何变量
int *p1=NULL;int *p2=0; 把指针指向空,什么也不指。
④ 常见错误:
int *p = 100;这种方法以后要杜绝,不要把一个数值给p,而应该是一个地址
4) 用指针来获取指向的内存单元的内容,*p代表p所指向的内存单元的内容
5) 用指针作为形参来定义函数来交换两数的值
//错误交换1
void swap1(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}
//错误交换2
void swap2(int *p1,int *p2){
int *p;
p = p1;
p1 = p2;
p2 = p;
}
//上面两种方法都是值交换的形参变量
//正确交换
void swap3(int *p1,int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
9. 指针的应用
1) 在函数中通过指针变量来修改指针变量指向的内容
2) 通过指针让函数有多个返回值
两个应用:
#include <stdio.h>
//用指针改变主调函数中的值
void changeValue(int *p){
*p = 100;
}
//让函数有多个返回值,并不是return多个值,而是看上去得到了多
个返回值
void caculator(int a,int b,int *add,int *jian,int
*cheng,float *chu){
*add = a+b;
*jian = a-b;
*cheng = a*b;
*chu = a/(float)b;
}
int main(int argc, const char * argv[]) {
int p = 10;
changeValue(&p);
printf("p =%d\n",p);
int add=0,jian=0,cheng=0;
float chu=0.0f;
caculator(12, 4, &add,&jian, &cheng, &chu);
printf("add =%d\n",add);
printf("jian =%d\n",jian);
printf("cheng =%d\n",cheng);
printf("chu =%.2f\n",chu);
return 0;
}
10. 二级指针:就是存放另外一个指针变量的地址的指针(指向指针变量的指针变量)
11. 指针要区分类型
如果指针类型和指向的变量的类型不一致,用指针进行取值时,取到的内存中字节的大小与实际变量的大小不一致,比如说:指针类型为double类型的,而指向的变量的类型为int类型的,则指针在内存中要取8个字节,而int只有4个字节,所以会取到不属于这个变量的其他内存空间,所以结果可能会不一致;相反可能会只取到变量的一部分空间。