1.指针:
int* p,q; //都代表定义了一个int型的指针*p和一个int变量q
int *p,q; //都代表定义了一个int型的指针*p和一个int变量q
2.传递数组参数的实质其实是传递的数组首地址对应的指针
3.数组变量可以看成是const的指针,所以不能被直接赋值(int a[]={0};int b[] = a 错误)
数组变量不能被直接修改,隐形const;
4.大小写字母转换方法:
5.字符串变量
6.字符串输入——要安全的输入
一定要记得对字符串进行初始化!!!
int main(){
char *string;
scanf("%s", string);
printf("%s", string);
printf("\n");
system("pause");
return 0;
}
严重性 代码 说明 项目 文件 行
警告 C4700 使用了未初始化的局部变量“string” HelloCCC e:\itluanqibazao\visual studio 2015\helloccc\helloccc\源.cpp 11
7.字符串函数
#include<string.h>
strlen
size_t strlen(const char *s); //本函数不会修改传入的字符串,因为有const,想只读字符串可加const
返回s的字符串长度(不包括结尾的0)
#include<stdio.h>
#include<string.h>
int main(){
char string[]="Hello";
printf("strlen(string)=%d\n", strlen(string));
printf("sizeof(string)=%d\n", sizeof(string));
return 0;
}
strcmp
int strcmp(const char*s1,const char *s2);
比较两个字符串,返回:
0:s1==s2
1:s1>s2
-1:s1<s2
#include<stdio.h>
#include<string.h>
int main(){
char s1[] = "abc";
char s2[] = "abc"; //如果s2[]="Abc",则输出为32,因为'a'-'A'=32
printf("%d", strcmp(s1,s2)); //输出为0
printf("\n");
return 0;
}
安全版本:
int strncmp(const char*s1,const char *s2,size_t n); //只判断前n个字符是否相等
strcpy
char * strcpy(char *restrict dst,const char *restrict src);
- 把src的字符串拷贝到dst,restrict表明src和dst不重叠;
- 返回dst,为了能链起代码来
安全版本:
char * strncpy(char *restrict dst,const char *restrict src,szie_t n);
strcat
char * strcat(char *restrict s1,const char *restrict s2);
- 把s2拷贝到s1的后面,接成一个长的字符串;
- 返回s1
- s1必须有足够的空间
strcpy和strcat都可能出现安全问题:如果目的地没有足够的空间?
安全版本:
char * strncat(char *restrict s1,const char *restrict s2,size_t n); //最多链接n个字符
strchr
char * strchr(const char *s,int c); //从左向右找
char * strrchr(const char *s,int c); //从右向左找
- 在字符串s中寻找字符c第一次出现的位置
- 知道之后返回的是指针
- 返回NULL表示没有找到
strstr
strstr(str1,str2) 函数
- 用于判断字符串str2是否是str1的子串。
- 如果是,则该函数返回str2在str1中首次出现的地址;
- 否则,返回NULL。
printf("%s",strstr("Hello world!", "world"));
输出:
world!
用%p可输出地址;