• 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还得加
    
    
    //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中,复制中包含(终止符) ,感觉跟剪切一样
    
    // 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
    ", 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
    ",s[i]);
        }
        printf("----------------------------------
    ");	
        printf("%s
    ", 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
        ",s[i]);
            }
            printf("----------------
        ");
            printf("%s
        ",s);
        }
        //gets不能用类似'%s'或者'%d'之类的字符转义,只能接受字符串的输入
        
    • fgets函数

      /*gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
      由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便*/
      
      char s[100]={0};
      fgets(s,sizeof(s),stdin);
      

      stdin是标准输入,一般指键盘输入到缓冲区里的东西。

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

    puts

    //puts函数打印字符串,与printf不同,puts会在最后自动添加一个'
    '
    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] != '') {
    		
    			len = len + 1;
    		
    		}
    	
    	}
    	printf("%d", len);
    
    
    //size_t strlen(const char* _Str); 返回不包含字符串结尾''的字符串长度
    char s[100]="老龙很帅,在座的各位都很丑!!!";
    int len=strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)
    printf("%d
    ",len);
    //printf("%d",strlen(s));
    
    
    //自定义strlen函数实现
    int _strlen(const char* _str){
        int len=0;//计算_str长度
        if(_str!=NULL){
            while((*_str++)!='')
                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
    ",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
    ",len);
    char s1[100]="abc123321";
    strcat(s,s1);//将两个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题
    printf("%s
    ", s);
    
    
    //自定义strcat函数实现
    void _strcat(char* _str1,const char* _str2){
        if(_str1!=NULL&&_str2!=NULL){
            while(*_str1!='')
                _str1++; //循环至str1字符串末尾
            while(*_str2!='')
              *_str1++=*_str2++; //把字符串_str2里面的内容存储至_str1中
            *_str1='';//结尾str1赋值''表示字符串结束
        }
    }
    
    
    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
    ", s);
    
    
    //自定义strncat函数实现
    void _strncat(char* _str1, const char* _str2, size_t len){
    	if (_str1 != NULL&&_str2 != NULL){
    		while (*_str1 != '')_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
    ", 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++)!='')
        }    
    }
    
    
    strncpy字符串有限拷贝

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

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

    char s[4][100] = { 
    		"我",
    		"笑",
    		"了",
    		"哈哈"
    	};
    	for (int i = 0; i < 4; i++) {
    	
    	
    		printf("%d:%s
    ", i,s[i]);
    		Sleep(1000);
    		system("Pause");
    		system("cls");
    	}
    	编号: 内容
    
    
    	char str[100];
    	
    	for (int i = 0; i < 100; i++) {
    		sprintf ( str, "%d.bmp
    ", 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
    ",x);
    	printf("%x
    ", y);
    	printf("%s
    ",b);
    
    

    10.strchr查找字符地址

    char str[128] = "Hello World!";
    printf("%c
    ", *(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++ != ''){
    			if (*_str1 == ch){
    				return (char*)_str1;
    			}
    		}
    	}
    	return NULL;
    }
    
    

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

    char str[128] = "sssssdfljaslf";
    	char str1[128] = "df";
    	printf("%s
    ",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
    ", p);
    		p = strtok(NULL, "@");
    	}
    
    

    atoi转化为int atof转化为float atol转化为long
    需要包含头文件stdlib.h

  • 相关阅读:
    Java多线程
    2018腾讯校招软件开发岗在线笔试题
    2018京东校招Java笔试题
    计模式之中介者、观察者
    值得注意的Java基础知识
    Java的内部类
    用静态内部类实现单例模式
    String,StringBuilder区别,一个是常量,一个是可变量
    ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象
    List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?
  • 原文地址:https://www.cnblogs.com/heerha/p/13773006.html
Copyright © 2020-2023  润新知