首页 > 其他分享 >7.字符串与字符数组

7.字符串与字符数组

时间:2022-10-05 22:23:28浏览次数:42  
标签:字符 int str2 str1 char 数组 字符串 NULL

字符串与字符数组

  • 字符数组定义

    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,字符串追加

    //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,字符串有限追加

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

标签:字符,int,str2,str1,char,数组,字符串,NULL
From: https://www.cnblogs.com/sys2410/p/16756587.html

相关文章

  • 六、字符编码及使用
    目录一、字符编码概念讲解:发展历史:使用讲解:编码及解码python2和python3中的区别一、字符编码概念讲解:对于文本文件,因为计算机只认识二进制,所以需要一个翻译本来充当媒......
  • 树状数组-归并排序-逆序对-2426. 满足不等式的数对数目
    问题描述给你两个下标从0 开始的整数数组 nums1和 nums2 ,两个数组的大小都为 n ,同时给你一个整数 diff ,统计满足以下条件的 数对 (i,j) :0<=i<j<=n-......
  • java如何将字符串转换为json格式字符串呢?
    转自:http://www.java265.com/JavaJingYan/202206/16540828373607.htmlJSON简介:   JSON(JavaScriptObjectNotation,JS对象简谱)是一种轻量级的数据交换格式。它基......
  • shell 字符运算
    foriin{97..122};dols/dev/sd$(printf\\"$(printf%03o"$[i+1]")");done[root@bogon~]#foriin{97..122};dols/dev/sd$(printf\"$(printf%03o"$[i+1]......
  • 代码随想录day11 | 232.用栈实现队列 225.队列实现栈 20.有效的括号 1047. 删除字符
    232.用栈实现队列题目|文章1.使用两个栈(修改输出)思路1.使用两个栈,用一个栈输入数据,用另一个栈输出数据2.当输出栈为空时,将输入栈的数据转移到输出栈中实现点击查看......
  • 重排字符串数组
    /*给定一系列长度相等的字符串,请对字符串进行重排,使得相邻的2个字符串之间仅有一个字符差异,请输出重排后的结果:如果有多个解,则输出字典序的最小的解。如果无解,则输出字符......
  • 数组和函数
     数组1.概念:相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。(具有相同数据类型)2.定义:基本格式:数据类型数组名[数组大小]3.数组......
  • LCP 最长公共前缀(一个字符串中,两个位置的后缀的最长公共前缀)
    LCP也可以用来进行一个字符串的子字符串的比较需要预处理lcp[i][j]数组,表示从i开始的后缀和从j开始的后缀的最长公共前缀lcp[i][j]可以从lcp[i+1][j+1]递推过来O(n^2)预......
  • 字符编码 XUTF
    /**Copyright(c)HuaweiTechnologiesCo.,Ltd.2019-2020.Allrightsreserved.*Description:上机编程认证*Note:缺省代码仅供参考,可自行决定使用、修改或删除......
  • 字符串哈希 模板 例题
    字符串哈希可以快速判断两个子字符串是否相等原理:https://www.cnblogs.com/ydUESTC/p/15722400.html注意字符串哈希时后面的字符视为低位,这样方便取一段字符的哈希时先......