2020.9.29 第七课 字符串函数与字符数组

字符串与字符数组

总结

//随机数函数需要加头文件<stdlib.h>
	//srand((unsigned int)time (NULL));
	//rand();

//scanf("%s",str);

//gets(str); //能读取空格,缓冲区会溢出

//fgets(str, sizeof(str), stdin); //能缓存多少就多少,多了不要了 stdin标准输入

//puts(str); //默认在结尾换行,printf还得加\n

//strlen(str)//字符串函数需要加头文件<string.h>  sizeof()计算的是变量在内存中所占据的空间,strlen()计算的是变量有效字符的长度

//strcat(str,str1),字符串追加(将两个字符串拼接起来) 

//strncat(str,str1,3)字符串有限追加,将str1中的三个有效字符拼到str中

//strcmp(str,str1)字符串比较, 小于为-1   大于为1 等于为0

//strcpy(str,str1)字符串拷贝,将str1中复制到str中,复制中包含\0(终止符) ,感觉跟剪切一样

// sprintf(str,"哈哈");输出哈哈到str字符串中

//sscanf(str,"%d %x %[a-z]",...) 从指定格式化字符串读取(提取)到...中

//strchr(str,'...')查找字符...的地址  *(char*)(strchr(str,'H'))//解开字符H的地址,输出H,可以在后面加减输出H后面或前面的字符
	
//strstr(str,str1)  查找子串()从一样的后面显示

//strtok(str,"...") 分割字符...之前的内容

字符数组定义

char array[100];

字符数组初始化

char array[100]={'a','b','c','d'};
char array[100]="abcd";
char array[100]={0};
char array[]="abcd";

1.随机数产生函数rand与srand(头文件stdlib.h)

rand是伪随机数产生器,每次调用rand产生的随机数都是一样的

如果调用rand之前先调用srand就出现任意的随机数

只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数

#include <time.h>
int main(){
	int t = (int)time(NULL);
	srand(t); //srand((unsigned int)time(NULL));
      
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", rand());
	}
}
        

2.scanf与gets(gets能读取空格)(fgets能装多少就装多少 多了不要了)

#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是标准输入,一般指键盘输入到缓冲区里的东西。

3.puts(默认在结尾换行,printf得加\n)

puts

//puts函数打印字符串,与printf不同,puts会在最后自动添加一个'\n'
char s[]="老龙很帅,在座的各位都很丑!!!";
puts(s);

fputs函数

//fputs是puts的文件操作版本
char s[]="老龙很帅,在座的各位都很丑!!!";
fputs(s,stdout); //stdout标准的输出

4.strlen,字符串长度

字符串函数需要加头文件<string.h> sizeof()计算的是变量在内存中所占据的空间,strlen()计算的是变量有效字符的长度
自己编一个strlen的功能
    
char str[100]="随便的一段话";
int len=0;
	for (int i = 0; i < sizeof(str); i++) {
		if (str[i] != '\0') {
		
			len = len + 1;
		
		}
	
	}
	printf("%d", len);

//size_t strlen(const char* _Str); 返回不包含字符串结尾'\0'的字符串长度
char s[100]="老龙很帅,在座的各位都很丑!!!";
int len=strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)
printf("%d\n",len);
//printf("%d",strlen(s));

//自定义strlen函数实现
int _strlen(const char* _str){
    int len=0;//计算_str长度
    if(_str!=NULL){
        while((*_str++)!='\0')
            len++;
    }
    return len;
}

5.strcat,字符串追加(将两个字符串拼接起来,)

char str[100]="1233321";
char str1[100]="789987";
int len = strlen(str);
	for (int i = 0; i < strlen(str1); i++) {
		str[len + i] = str1[i];  //也就是令str[下标]=str1内容
		}
printf("%d\n",str);

//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";
strcat(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,字符串有限追加strncat(s,s1,想追加的字节数)
//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++;
		}
	}
}

6.strcmp,字符串比较(小于-1 大于 1 等于 0)

//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);

7.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字符串有限拷贝

8.sprintf,格式化字符串(将格式化结果输出到数组字符串)用于做字符串拼接(游戏图片)

​ 和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串

char s[4][100] = { 
		"我",
		"笑",
		"了",
		"哈哈"
	};
	for (int i = 0; i < 4; i++) {
	
	
		printf("%d:%s\n", i,s[i]);
		Sleep(1000);
		system("Pause");
		system("cls");
	}
	编号: 内容

	char str[100];
	
	for (int i = 0; i < 100; i++) {
		sprintf ( str, "%d.bmp\n", i+1);
	
		printf("%s",str);
	}

9.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);

10.strchr查找字符地址

char str[128] = "Hello World!";
printf("%c\n", *(char*)(strchr(str,'H')+1));
结果是'e'

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;
}

11.strstr 查找子串()从一样的后面显示

char str[128] = "sssssdfljaslf";
	char str1[128] = "df";
	printf("%s\n",strstr(str,str1));
结果是dfljaslf

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;
}

12.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

posted @ 2020-10-06 11:36  鹤儿哈  阅读(110)  评论(0编辑  收藏  举报