zoukankan      html  css  js  c++  java
  • c语言——字符串操作

    一、字符串基本操作

    1.1初始化

    //字符串基本操作
    //字符串是以0或者''结尾的字符数组,(数字0和字符''等价)
    void test01(){
    
    	//当输出的时候,从开始位置直到找到0结束
    	//因为输出结尾没有0,会出错
    	char str1[] = { 'h', 'e', 'l', 'l', 'o', '' };
    	printf("%s
    ",str1);
    
    	//字符数组部分初始化,剩余填0
    	char str2[100] = { 'h', 'e', 'l', 'l', 'o' };
    	printf("%s
    ", str2);
    
    	//如果以字符串初始化,那么编译器默认会在字符串尾部添加''
    	char str3[] = "hello";
    	printf("%s
    ",str3);
    	printf("sizeof str:%d
    ",sizeof(str3));
    	printf("strlen str:%d
    ",strlen(str3));
    
    	//sizeof计算数组大小,数组包含''字符
    	//strlen计算字符串的长度,到''结束
    
    	//那么如果我这么写,结果是多少呢?
    	char str4[100] = "hello";
    	printf("sizeof str:%d
    ", sizeof(str4));
    	printf("strlen str:%d
    ", strlen(str4));
    
    	//请问下面输入结果是多少?sizeof结果是多少?strlen结果是多少?
    	char str5[] = "helloworld"; 
    	printf("%s
    ",str5);
    	printf("sizeof str5:%d
    ",sizeof(str5));
    	printf("strlen str5:%d
    ",strlen(str5));
    
    	//再请问下面输入结果是多少?sizeof结果是多少?strlen结果是多少?
    	char str6[] = "hello12world";
    	printf("%s
    ", str6);
    	printf("sizeof str6:%d
    ", sizeof(str6));
    	printf("strlen str6:%d
    ", strlen(str6));
    }
    
    

    1.2 字符串拷贝

    //拷贝方法1
    void copy_string01(char* dest, char* source ){
    
    	for (int i = 0; source[i] != '';i++){
    		dest[i] = source[i];
    	}
    
    }
    
    //拷贝方法2
    void copy_string02(char* dest, char* source){
    	while (*source != '' /* *source != 0 */){
    		*dest = *source;
    		source++;
    		dest++;
    	}
    }
    
    //拷贝方法3
    void copy_string03(char* dest, char* source){
    	//判断*dest是否为0,0则退出循环
    	while (*dest++ = *source++){}
    }
    
    //拷贝方法4
    //1)应该判断下传入的参数是否为NULL
    //2)最好不要直接使用形参
    int copy_string04(char* dest, char* source){
    	if (dest == NULL){
    		return -1;
    	}
    	if (source == NULL){
    		return -2;
    	}
    
    	char* src = source;
    	char* tar = dest;
    
    	while (*tar++ = *src++){}
    
    	return 0;
    }
    
    

    二、字符串的格式化

    2.1 sprintf

    #include <stdio.h>
    int sprintf(char *str, const char *format, ...);
    功能:
         根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到    出现字符串结束符 ''  为止。
    参数: 
    	str:字符串首地址
    	format:字符串格式,用法和printf()一样
    返回值:
    	成功:实际格式化的字符个数
    	失败: - 1
    
    void test(){
    	
    	//1. 格式化字符串
    	char buf[1024] = { 0 };
    	sprintf(buf, "你好,%s,欢迎加入我们!", "John");
    	printf("buf:%s
    ",buf);
    
    	memset(buf, 0, 1024);
    	sprintf(buf, "我今年%d岁了!", 20);
    	printf("buf:%s
    ", buf);
    
    	//2. 拼接字符串
    	memset(buf, 0, 1024);
    	char str1[] = "hello";
    	char str2[] = "world";
    	int len = sprintf(buf,"%s %s",str1,str2);
    	printf("buf:%s len:%d
    ", buf,len);
    
    	//3. 数字转字符串
    	memset(buf, 0, 1024);
    	int num = 100;
    	sprintf(buf, "%d", num);
    	printf("buf:%s
    ", buf);
    	//设置宽度 右对齐
    	memset(buf, 0, 1024);
    	sprintf(buf, "%8d", num);
    	printf("buf:%s
    ", buf);
    	//设置宽度 左对齐
    	memset(buf, 0, 1024);
    	sprintf(buf, "%-8d", num);
    	printf("buf:%s
    ", buf);
    	//转成16进制字符串 小写
    	memset(buf, 0, 1024);
    	sprintf(buf, "0x%x", num);
    	printf("buf:%s
    ", buf);
    
    	//转成8进制字符串
    	memset(buf, 0, 1024);
    	sprintf(buf, "0%o", num);
    	printf("buf:%s
    ", buf);
    }
    

    2.2 sscanf

    #include <stdio.h>
    int sscanf(const char *str, const char *format, ...);
    功能:
        从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
    参数:
    	str:指定的字符串首地址
    	format:字符串格式,用法和scanf()一样
    返回值:
    	成功:实际读取的字符个数
    	失败: - 1
    
    格式 作用
    %*s或%*d 跳过数据
    %[width]s 读指定宽度的数据
    %[a-z] 匹配a到z中任意字符(尽可能多的匹配)
    %[aBc] 匹配a、B、c中一员,贪婪性
    %[^a] 匹配非a的任意字符,贪婪性
    %[^a-z] 表示读取除a-z以外的所有字符
    //1. 跳过数据
    void test01(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	//匹配第一个字符是否是数字,如果是,则跳过
    	//如果不是则停止匹配
    	sscanf("123456aaaa", "%*d%s", buf); 
    	printf("buf:%s
    ",buf);
    }
    
    //2. 读取指定宽度数据
    void test02(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	sscanf("123456aaaa", "%7s", buf);
    	printf("buf:%s
    ", buf);
    }
    
    //3. 匹配a-z中任意字符
    void test03(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	//先匹配第一个字符,判断字符是否是a-z中的字符,如果是匹配
    	//如果不是停止匹配
    	sscanf("abcdefg123456", "%[a-z]", buf);
    	printf("buf:%s
    ", buf);
    }
    
    //4. 匹配aBc中的任何一个
    void test04(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
    	sscanf("abcdefg123456", "%[aBc]", buf);
    	printf("buf:%s
    ", buf);
    }
    
    //5. 匹配非a的任意字符
    void test05(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
    	sscanf("bcdefag123456", "%[^a]", buf);
    	printf("buf:%s
    ", buf);
    }
    
    //6. 匹配非a-z中的任意字符
    void test06(){
    	char buf[1024] = { 0 };
    	//跳过前面的数字
    	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
    	sscanf("123456ABCDbcdefag", "%[^a-z]", buf);
    	printf("buf:%s
    ", buf);
    }
    
    
  • 相关阅读:
    JSP前三章测试改错
    实现文件上传
    Url和Uri的区别
    四套读写文件方案
    C++第一课
    数据聚合架构模式
    高并发怎么解决?
    为什么做不了软件架构师
    完整版go-mysql-elasticsearch安装步骤
    安装GO
  • 原文地址:https://www.cnblogs.com/long5683/p/12885779.html
Copyright © 2011-2022 走看看