字符串与字符数组
字符串与字符数组 字符数组定义
-
char str[100]//字符数组,名字为str 容量存储100个str类型的数据、字符 -
字符数组初始化
char str[100]={'a','b','c','d'};//后面的字符默认为/0
char str[100]="abcd";//一个中文汉字占据两个字节 其他字符占一个字节
char str[100]={0};
char str[]="abcd";//自动分配后面字符数组的空间
char str[6][1024]={
"w",
"l",
"y",
"WO",
"AI" ,
"NI",
}//按照段落来存储5句句话1024个字节以内 -
-
-
随机数产生函数rand与srand
-
头文件stdlib.h
-
rand是伪随机数产生器,每次调用rand产生的随机数都是一样的
-
如果调用rand之前先调用srand就出现任意的随机数
-
只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数
-
-
指针
街道对应内存
门面对应字节 例:10 11 12 13(int为四个字节)
内存中的每一个字节都有一个与之对应的编号,这个编号就是地址
10这个编号就是他的指针
-
用scanf输入字符串
-
int x;
scanf("%d",&x);//把一个数据存储到x中、
int x[10];
scanf("%d",&x[0]);//把一个数据存储到数组的第一个空间str代表的是一个大空间中第一个小空间的编号(10)即为首地址
%s从这个大空间的第一个小空间开始存 这就是直接写str的原因
char Str[128];
int x[10];//从第一个空间开始存,存到整个数组中去。输出同理,知道遇见\0结束
scanf("%s",Str);
printf("%s\n",Str);
-
字符串的结束标志 scanf将回车,空格都认为是字符串输入结束标志.
-
字符串处理函数
-
gets(可以读取空格)而scanf空格也可以是结束的标志
-
-
const char*_Str//定义了一个常量char字符类型的指针,指针的名字叫做Str,传递的是Str这个字符数组的首地址,Str防止别人恶意修改
*是指针
//int*表示的是一个类型的指针 int 类型的指针
//int* p;int类型的指针叫做p p指向某个变量的首地址
//*p就是根据首地址把值解开,表示值(首地址的值) -
gets 满了就爆,fgets只能装那么多
/*gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便*/
char s[100]={0};
fgets(s,sizeof(s),stdin);//stdin即读取上面定义的大小stdin是标准输入,一般指键盘输入到缓冲区里的东西。
-
puts
//puts函数打印字符串,与printf不同,puts会在最后自动添加一个 '\n'
char s[]="老龙很帅,在 座的各位都很丑!!!";
puts(s); -
fputs函数
//fputs是puts的文件操作版本
char s[]="老龙很帅,在座的各位都很丑!!!";
fputs(s,stdout); //stdout标准的输出 -
strlen,字符串长度
//需要加上头文件#include<string.h>
//size_t strlen(const char* _Str); 返回不包含字符串结尾'\0'的字符串长度
char s[100]="老龙很帅,在座的各位都很丑!!!";
int len=strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)
printf("%d\n",len);//sizeof与srtlen的区别
char Str[100]="老吴很帅!!!"
printf("sizeof=%d\n",sizeof(Str));//100个字节(是括号里的)
printf("strlen=%d\n",strlen( Str));//11个字节(是引号里的)
//自定义strlen函数实现
int _strlen(const char* _str){
int len=0;//计算_str长度
if(_str!=NULL){
while((*_str++)!='\0')
len++;
}
return len;
} -
strcat,字符串追加(拼接)
//si ze_t strcat(char* _str1,const char* _str2) 将参数_str2追加到_str1后尾
char s[128]="Hello World!";
int len=strlen(s);//计算s字符串长度,返回一个字符串中的有效字符数量(不包含字符串结尾的0)
printf("len=%d\n",len);
char s1[100]="abc123321";
strcar(s,s1);//将两个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题
printf("%s\n", s);//自定义strcat函数实现
void _strcat(char* _str1,const char* _str2){
if(_str1!=NULL&&_str2!=NULL){
while(*_str1!='\0')
_str1++; //循环至str1字符串末尾
while(*_str2!='\0')
*_str1++=*_str2++; //把字符串_str2里面的内容存储至_str1中
*_str1='\0';//结尾str1赋值'\0'表示字符串结束
}
} -
strncat,字符串有限追加
//size_t strncat(char* _str1,const char* _str2,size_t len)
char s[128] = "老龙很帅";
char s1[50] = ",在座的各位都很丑!!!";
strncat(s, s1, 5);
printf("%s\n", s);//自定义strncat函数实现
void _strncat(char* _str1, const char* _str2, size_t len){
if (_str1 != NULL&&_str2 != NULL){
while (*_str1 != '\0')_str1++;
for (int i = 0; i < len; i++){
*_str1++ = *_str2++;
}
}
} -
strcmp,字符串比较
//int strcmp(const char* _str1,const char* _str2);
//比较两个字符串是否相等,相等返回0,不等返回非0
char s[128] = "aabc"; //>大于-1 等于0 小于1
char s1[50] = "aabcs";
printf("%d\n", strcmp(s, s1));//自定义strcmp函数实现
int _strcmp(const char* str1,const char* str2){
int ret = 0;
if (str1 != NULL&&str2 != NULL){
while (!(ret = *str1 - *str2) && *str1){
str1++;
str2++;
}
}
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
return 0;
} -
strncmp,字符串有限比较
int strcmp(const char* _str1,const char* _str2,size_t len); -
strcpy字符串拷贝
char *strcpy(char * _Str1, const char * _Str2);
//将参数_Str2拷贝到参数_Str1中//自定义strcpy函数实现
void _strcpy(char* _str1,const char* _str2){
if(_str1!=NULL&&_str2!=NULL){
while((*_str1++=*_str2++)!='\0')
}
} -
strncpy字符串有限拷贝
-
sprintf,格式化字符串 和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串
-
sscanf函数 sscanf类似于scanf函数,,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入
char s[128] = "10 0x10 aabc";
int x,y;
char b[100];
sscanf(s, "%d %X %[a-z]", &x,&y,b);
printf("%d\n",x);
printf("%x\n", y);
printf("%s\n",b); -
strchr查找字符
char * strchr(char * _Str, int _Ch);
//在参数_str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;//自定义strchr函数实现
char *strchr(const char* _str1,int ch){
if (str1 != NULL){
while (*_str1++ != '\0'){
if (*_str1 == ch){
return (char*)_str1;
}
}
}
return NULL;
} -
strstr
char* strstr(char* _str,const char* _substr)
//在参数_str中查找参数_substr指定子串,找到返回子串在_str中所在位置,没有找到返回NULL//自定义strstr函数实现
char* _strstr(char* _str, const char* _substr){
if (_str != NULL&&_substr != NULL){
int lenstr = strlen(_str);
int lensub = strlen(_substr);
if (lenstr < lensub)
return NULL;
int i, j;
for (i = 0; i < lenstr - lensub; i++){
for (j = 0; j < lensub; j++){
if (_str[i + j] != _substr[j])
break;
}
if (j == lensub)
return &_str[i];
}
}
return NULL;
} -
strtok分割字符串
//字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针
char buf[] = "abc@defg@igk";
char *p = strtok(buf, "@");
while (p)
{
printf("%s\n", p);
p = strtok(NULL, "@");
} -
atoi转化为int atof转化为float atol转化为long 需要包含头文件stdlib.h
-