字符串与字符数组
-
字符数组定义
char array[100]; -
字符数组初始化
char array[100]={\'a\',\'b\',\'c\',\'d\'}; char array[100]="abcd"; char array[100]={0}; char array[]="abcd"; -
随机数产生函数rand与srand
-
头文件stdlib.h
-
rand是伪随机数产生器,每次调用rand产生的随机数都是一样的
固定随机
-
如果调用rand之前先调用srand就出现任意的随机数
-
只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数
#include <time.h> int main(){ int t = (int)time(NULL); srand(t); for (int i = 0; i < 10; i++) { printf("%d\n", rand()); } }
-
-
用scanf输入字符串,空格也会结束,会溢出。
#include <stdio.h>
int main(){
char s[10]={0};
scanf("%s",s);//"%s"的作用就是输入一个字符串的,scanf是以回车键作为输入完成标示的,但回车键本身并不会作为字符串的一部分
//如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就会缓冲区溢出,导致程序崩溃
int i;
for(i=0;i<10;i++){
printf("%d\n",s[i]);
}
printf("----------------------------------\n");
printf("%s\n", s);
return 0;
}
-
字符串的结束标志
scanf将回车,空格都认为是字符串输入结束标志. -
字符串处理函数
-
gets,只接受字符串,空格不会结束,会溢出。
#include <stdio.h> int main(){ char s[100]={0}; gets(s);//gets认为回车的输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串 //gets和scanf一样存在缓冲区溢出的问题 int i; for(i=0;i<10;i++){ printf("%d\n",s[i]); } printf("----------------\n"); printf("%s\n",s); } //gets不能用类似\'%s\'或者\'%d\'之类的字符转义,只能接受字符串的输入
-
-
fgets函数
/*gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。 由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便*/ char s[100]={0}; fgets(s,sizeof(s),stdin);stdin是标准输入,一般指键盘输入到缓冲区里的东西。
-
puts,自动换行。
//puts函数打印字符串,与printf不同,puts会在最后自动添加一个\'\n\' char s[]="老龙很帅,在座的各位都很丑!!!"; puts(s); -
fputs函数
//fputs是puts的文件操作版本 char s[]="老龙很帅,在座的各位都很丑!!!"; fputs(s,stdout); //stdout标准的输出 -
strlen,字符串长度(有多少字符)
//size_t strlen(const char* _Str); 返回不包含字符串结尾\'\0\'的字符串长度 char s[100]="老龙很帅,在座的各位都很丑!!!"; int len=strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0) printf("%d\n",len);//自定义strlen函数实现 int _strlen(const char* _str/*字符串首地址的指针*/){ int len=0;//计算_str长度 if(_str!=NULL){//字符串不为空 while((*_str++)/*指针地址++*/!=\'\0\') len++; } return len; } -
strcat,字符串追加, 将s1追加到s后面. 会溢出, s, s1实际内容不能大于 s 总容量.
//size_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){//s1 s2 都不为空 while (*_str1 != \'\0\')//当前str1指针指向的内容不等于\0 _str1++; //指针地址++,既循环到str1字符串末尾 while (*_str2 != \'\0\')//当前str2指针指向的内容不等于\0 *_str1++ = *_str2++; //把字符串_str2里面的内容存储至_str1中(每个元素) //str2 == \'\0\'时跳出 *_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,字符串比较. 比ASCII码的大小, 就是比数字大小.
//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,字符串有限比较, 同strncat, 多个参数做循环.
int strcmp(const char* _str1,const char* _str2,size_t len); -
strcpy字符串拷贝, 同strcat, 省去判断s1
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字符串有限拷贝, 同strncat, 多个参数做循环.
-
sprintf,格式化字符串
和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串 写作输出, 实则输入 ```c char str[1000] = {}; for(int i=0; i<10; i++){ sprintf(str, %d.bmp, i); printf(%s,str); } ``` -
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