首页 > 其他分享 >2024-02-18-物联网C语言(7-字符串处理函数)

2024-02-18-物联网C语言(7-字符串处理函数)

时间:2024-02-18 21:56:17浏览次数:30  
标签:02 const int 18 s1 char 字符串 include 处理函数

7. 字符串

7.1 获取字符串的长度函数 - strlen

头文件: #include <string.h>
函数定义: size_t strlen(const char *s)
参数:s - 指定的字符串
返回值:当前字符串的长度
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    // 使用strlen获取字符串的长度
    // strlen获取字符串长度,遇到\0结束
    char s[100] = "hello world";
    printf("s1_len = %d\n",strlen(s));
    return 0;
}

输出结果

s1_len = 11

7.2 字符串拷贝函数 - strcpy

头文件: #include <string.h>
函数的定义: char *strcpy(char *dest, const char *sre);
函数的说明:
		拷贝 sc 指向的字符串到 dest指针指向的内存中,"\0"也会拷贝
函数的返回值:
		目的内存的地址
注意: 在使用此函数的时候,必须保证 dest 指向的内存空间足够大,否则会出现内存污染。
    
char *strncpy(char *dest,const char *src,size_t n);
函数的说明:将src指向的字符串前n个字节,拷贝到dest指向的内存中
返回值:目的内存的首地址
注意:
1、strncpy不拷贝 "\0"
2、如果n大于src指向的字符串中的字符个数,则在dest后面填充 n-strlen(src) 个 "\0"  
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char s1[100] = "hello world";
    char s2[30] = "dasfasfags";
    // 将s2拷贝到s1中
	// 需要保证s1的空间足够大,不然会出现内存问题
    strcpy(s1, s2);
    printf("s1 = %s\n", s1);
    return 0;
}

输出结果

s1 = dasfasfags

7.3 字符串追加函数 - strcat

头文件:#include <string.h>
函数定义:char *strcat(char *deet, const char *src);
函数功能: strcat,函数追加 src字符串到 dest,指向的字符串的后面。追加的时候会追加"\0"
注意:保证 dest 指向的内存空间足够大。
    
char *strncat(char *dest, const char *src, size_t n);
追加 src指向的字符串的前 n个字符到 dest指向的字符串的后面。
注意: 如果 n 大于 src,的字符个数,则只将 src字符串追加到dest, 指向的字符串的后面追加的时候会追加"\0"
#include <stdio.h>
#include <string.h>
int main(int argc, char *argy[])
{
    // 使用strcat函数追加字符串
    char s1[32] = "hello world";
    char s2[32] = "abcdef";
    // strcat是从s1的\@的位置开始追加,直到s2的第一个0复制完毕后结束
    strcat(s1, s2);
    printf("sl =%s\n", s1);
    return 0;
}

输出结果

sl =hello worldabcdef

7.4 字符串比较函数 - strcmp

//比较strcmp/strncmp
头文件:#include<string.h>
函数定义:int strcmp(const char *sl,const char *s2);
函数说明: 比较 s1 和 s2 指向的字符串的大小,
比较的方法: 逐个字符去比较 ascII 码,一旦比较出大小返回
返回值:
    1. 如果 s1 指向的字符串大于 s2 指向的字符串 返回 1;
    2. 如果 s1 指向的字符串小于 s2 指向的字符串 返回-1;
    3. 如果相等的话返回 0;

strncmp( const char *sl,const char *s2,size_t n) - 比较前n个字符
#include <stdio.h>
#include <string.h>
int main(int argc, char *argy[])
{

    char s1[32] = "hella";
    char s2[32] = "hello";

    int ret = strcmp(s1, s2);

    if (ret == 0){
        printf("s1 = s2 \n");
    }else if (ret>0)
    {
        printf("s1 > s2 \n");
    }else{
        printf("s1 < s2 \n");
    }

    return 0;
}

输出结果

s1 < s2 

7.5 字符串查找函数 - strchr

头文件:#include <string.h>
char *strchr(const char *s,int c);
功能:在字符指针s指向的字符串中,找ascii码为c的字符
参数:
	s:指定的字符串
    c:要查找的字符返回值:
成功:找到的字符的地址
失败:NULL注意:s指向的字符串中有多个ASCII为c的字符,则找的是第1个字符
    
char *strrchr(const char *s,int c);
功能:在s指向的字符串中,找最后一次出现的ASCII为c的字符,
#include <stdio.h>
#include <string.h>
int main(int argc, char *argy[])
{

    char s1[32] = "hella6dasdas";
    char *ret = strchr(s1,'6');
    if(ret == NULL){
        printf("NOT FOUND\n");
    } else {
        printf("GOT , IN POSITINO %d !  \n", ret -s1 );
    }
    
    return 0;
}

输出结果

GOT , IN POSITINO 5 ! 

7.6 字符串匹配函数 - strstr

头文件:#include <string.h>
char *strstr(const char *haystack, const char *needle);
函数说明: 在 haystack 指向的字符串中查找 needle 指向的字符串,也是首次匹配
返回值:
    1. 找到了: 找到的字符串的首地址
    2. 没找到: 返回 NULL
#include <stdio.h>
#include <string.h>
int main(int argc, char *argy[])
{

    char s1[32] = "hella6dasdas";
    char *ret = strstr(s1, "6d");
    if (ret == NULL)
    {
        printf("NOT FOUND\n");
    }
    else
    {
        printf("GOT , IN POSITINO %d !  \n", ret - s1);
    }

    return 0;
}

输出结果

GOT , IN POSITINO 5 !  

7.7 字符串转换为数值 - atoi

atoi/atol/atof  //字符串转换功能
头文件:#include <stdlib.h>
函数的定义:int atoi(const char *nptr);
函数的功能: 将 nptr 指向的字符串转换成整数,返回
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argy[])
{

    char s1[32] = "12314";
    int ret1 = atoi(s1);

    printf("ret1 =  %d  \n", ret1);

    char s2[] = "3.1456414";
    double ret2 = atof(s2);
    printf("ret2 =  %lf  \n", ret2);

    return 0;
}

输出结果

ret1 =  12314  
ret2 =  3.145641

7.8 字符串切割函数 - strtok

#include<string.h>
char *strtok(char *str,const char *delim);
功能:对字符串进行切割
参数:
	str:要切割的字符串第一次切割,就传入指定的字符串,后面所有次的切割传NULL
    delim:标识符,要根据指定的delim进行切割,切割的结果不包含delim返回值:
返回切割下来的字符串的首地址,如果都切割完毕,则返回NULL
#include <stdio.h>
#include <string.h>

int main(int argc, char *argy[])
{

    char s1[32] = "12314:dasda1:54131das:31321das";
    char *ret1;
    ret1 = strtok(s1, ":");
    // 第一次切割
    printf("ret1 =  %s  \n", ret1);
	// 后面所有次的切割传NULL
    while ((ret1 = strtok(NULL, ":")) != NULL)
    {

        printf("ret1 =  %s  \n", ret1);
    }

    return 0;
}
ret1 =  12314  
ret1 =  dasda1  
ret1 =  54131das  
ret1 =  31321das  

7.9 格式化字符串操作函数

#include <stdio.h>
int sprintf(char *str,const char *format,...);
功能:将按照格式保存的字符串复制给str
参数:
	str:保存字符串
	format: 同printf
返回值:
	保存的字符串的字节数

#include<stdio.h>
int sscanf(const char *str,const char *format,...)
功能:scanf是从终端读取数据并赋值给对应变量,而sscanf是从第一个参数中读取数据
参数:
	str:指定要获取内容的字符串
	format:按照格式获取数据保存在变量中
返回值:
	成功获取的个数
#include <stdio.h>

void test1(){
    char buf[20];
    int a,b,c;

    sprintf(buf,"%d:%d:%d",2013,10,1);
    printf("buf = %s\n",buf);
}

void test2(){
    //1. 跳过数据:%s或%*d
    char buf1[20];
    sscanf("1234 5678","%*d %s",buf1);
    printf("%s\n",buf1);

    // 2. 读指定宽度的数据,%[width]s
    char buf2[20];
    sscanf("12345678","%4s",buf2);
    printf("%s\n",buf2);

    
    // 3. 支持集合操作:只支持获取字符串
    // %[a-z]  表示匹配a到z中任意字符(尽可能多的匹配)
    // %[aBc]  匹配a、B、c中一员,贪婪性
    // %[^aFc] 匹配非a、F、c的任意字符,贪婪性
    // %[^a-z] 表示读取除a-z以外的所有字符
    char buf3[20];
    sscanf("agcd32DajfDdFF","%[a-z]",buf3);
    printf("%s\n",buf3);
    return 0;
}

int main(int argc, char const *argv[])
{
    test1();
    test2();
    return 0;
}

输出结果

buf = 2013:10:1
5678
1234
agcd

7.10 const

// 1.const 修饰普通变量,代表只读的意思
const int a=100; //定义了一个只读变量a值为100, 以后在程序中,不能再给a赋值了
a=200;//错误的,a只读

// 2:const 修饰指针
// 意思是 str 指向的内存的内容,不能通过 str来修改
const char *str  

修饰全局变量

//const修饰全局变量
//此时全局变量只能使用,不能修改;
//如果直接拿全局变量修改值,编译直接报错;
//如果使用全局变量的地址修改值,运行时程序异常结束;
const int a =100;
void test1(){
    printf("a = %d\n",a);
    a = 6600; // 错误,编译直接报错
    
    int *p = &a;
    *p = 888; // 错误,运行时程序异常结束
    printf("a = %d\n",a);
}

修饰局部变量

//const修饰局部变量
//如果直接使用局部变量修改值,编译直接报错;
//如果使用局部变量的地址修改值,正确;
void test2(){
    const int b = 100;
    b = 666;			// 错误,编译直接报错
    printf("b = %d\n",b); 
    
    int *p = &a;
    *p = 888;   		// 正确,可以通过变量的地址修改值
    printf("a = %d\n",a);
}

修饰指针变量

// 如果const修饰指针变量的类型,无法通过指针变量来修改地址里面的值
	const int *p = &c;
// 如果const修饰指针变量,无法修改指针变量保存的地址
	int * const p = &c;
// 如果const既修饰指针变量的类型,又修饰指针变量,则只能通过原本变量修改值
	const int * const p = &c;

标签:02,const,int,18,s1,char,字符串,include,处理函数
From: https://www.cnblogs.com/hasaki-yasuo/p/18020021

相关文章

  • 2024.2.18 近期练习
    P4764值域为\([l,r]\)的生成森林,也就是把值\(\gel\)的边拿出来生成森林,其中边\(\ler\)的权值和。我们现在要求所有\(l\),$\gel$边的生成森林中边有哪些。考虑从大往小加边,设当前加入第条边\((u,v,w)\)。因为这条边最小,所以这条边必选。若\(u,v\)不连通,那么直接......
  • 闲话2.18
    晚上开始模拟费用流了......
  • CMU 15-445(Fall 2023) Project3 Query Execution个人笔记
    Task#1-AccessMethodExecutorsSeqScan算子实现逻辑使用exec_ctx属性获取对应的TableInfo调用MakeIterator方法,获取表的迭代器在Next方法中,每次利用迭代器获得一个满足条件的元组(检查元组是否被删除、元组是否满足filter)Insert算子实现逻辑在Next方法中调用child......
  • winter 2024 第三四周周报
    内容week3day1https://www.cnblogs.com/bible-/p/18018423这天是打寒假牛客2,请假了后面补的题,补了10道吧,感觉这些题花点时间都是可以写的,但是赛时真的很容易被卡,板子题也挺多,线段树、树状数组、字典树(太久不写有点忘了)week3day3https://www.cnblogs.com/bible-/p/18011488打......
  • [2024 AtCoder 比赛历程]
    2024.1.20ABC337-G题目大意:给定一棵树,对于树上的每个点$u$,定义$f[u]$表示满足点$w$在点$u$到点$v$的路径中,且$w>v$的点对$(w,v)$的数量。$u$可以等于$w$。解法:比赛时先考虑将一个点钦定为$w$时,该点对其他点的贡献。发现对于一个点,它可以通过它的一个子树内......
  • (2024.2.5-2024.2.18)C语言学习小结
    这两周主要围绕《HeadfirstC》这本书展开C语言学习,同时尝试学习DES密码算法C程序。基本内容《HeadfirstC》学习的内容基本上就是进程与通信、网络、线程这块。以下是思维导图:实践练习除了书上的一些小练习之外,我也实践写了HFC的C语言实验室2的程序,一波三折,详见C代码......
  • NewStarCTF 2023 WEEK2|REVERSE SMC 使用IDApython静态解决SMC
    先来一篇IDApyhotn的指令教程https://www.cnblogs.com/zydt10/p/17676018.html*自己编的这题对应的expa=[0x11,0x22,0x33,0x44]foriinrange(38):result=a[i&3]ida_bytes.patch_byte(0x403040+i,get_wide_byte(0x403040+i)^result)在IDA中运行完exp之后,......
  • 2024-02-18-物联网C语言(6-动态内存申请)
    6.动态内存申请6.1动态分配概述​ 在数组一章中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。​ 为了解决上述问题,C语言提供了-些内存管理函数,这些内存管理函数可以按需......
  • 2024牛客寒假算法基础集训营2
    C.TokitsukazeandMin-MaxXOR题解:01Trie观察后发现对序列\(a\)排序并不影响结果然后容易知道,对于\(i<j,a_i\oplusa_j\leqk\),一共有\(2^{i-j-1}\)种序列\(b\)满足条件,特别的,如果\(i=j\),只有\(1\)种满足条件那么现在问题就转换为,我们固定\(a_......
  • 亚马逊云ec2-user安装node-js-18.16.0
    1,下载vnm管理工具curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh|bashexportNVM_DIR="$HOME/.nvm"[-s"$NVM_DIR/nvm.sh"]&&\."$NVM_DIR/nvm.sh"#Thisloadsnvm[-s"$NVM_DIR/bash......