例程三、c语言 字符串匹配 sscanf 字符串查找 返回指针地址 段错误Segmentation fault

本文主要是介绍例程三、c语言 字符串匹配 sscanf 字符串查找 返回指针地址 段错误Segmentation fault,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、首先,介绍下sscanf用法

linux终端窗口下,敲命令:man sscanf可以得到完整描述:

1. 定义:int sscanf(const char *str, const char *format, ...);

2. 与scanf区别:

       The scanf() function reads input from the standard input stream stdin, fscanf() reads input from the stream pointer stream, and sscanf() reads its  input  from  the character string pointed to by str.

3. 使用demo:

vim sscanf_test.c

#include <stdio.h>int main(){char str[64] = "ATTF: 2";int val;sscanf(str, "ATTF: %d", &val);printf("val = %d\n", val);return 0;
}

报错退出后,编译,运行:

二、常见一些用法

  1. 忽略前面字符串

#include <stdio.h>int main(){char str[64] = "ATTF: 2";int val;sscanf(str, "%*s%d", &val);printf("val = %d\n", val);return 0;
}

注意到%d前面加了%*s,本来%s是格式化字符串,加了*之后就是忽略格式化字符串。

另外,%*s跟%d之间可以加空格,也可以不加空格,因为sscanf输入时会忽略前面的空格。

常用的还有%*d  %*c  %*g %*u %*x %*s %*G等等。

注:%g  :根据数值不同会自动选择%f或%e(会省去小数点后多余的0)

输出值同上:

2. 忽略令人头痛的换行符来进行字符串匹配


/** find the position where str2 in str1.* if not, return NULL* else return first find str2 position in str1*/
const char *vip_str_str_len(const char *str, const char *subs, int length){const char* tmp=str;if (!*str || !*subs)return NULL;while (length > 0){//用于每次将父串向后移动一个字符const char* tmp1=tmp;//记录子串地址const char* sub1=subs;while (*sub1!='\0' && length > 0){//若不相等则跳出,将父串后移一个字符if (*sub1!=*tmp1)break;//若相等且子串下一个字符是末尾则是这个父串的子串if (*sub1==*tmp1&&*(sub1+1)=='\0')return tmp;//若相等则继续比较下一个字符if (*sub1==*tmp1){sub1++;tmp1++;}}tmp++;length--;}return NULL;
}const char* vip_str_str(const char* str, const char *subs){const char* tmp=str;if(!*subs)return NULL;while (*tmp!='\0'){//用于每次将父串向后移动一个字符const char* tmp1=tmp;//记录子串地址const char* sub1=subs;while (*sub1!='\0'&&*tmp1!='\0'){//若不相等则跳出,将父串后移一个字符if (*sub1!=*tmp1)break;//若相等且子串下一个字符是末尾则是这个父串的子串if (*sub1==*tmp1&&*(sub1+1)=='\0')return tmp;//若相等则继续比较下一个字符if (*sub1==*tmp1){sub1++;tmp1++;}}tmp++;}return NULL;
}

主函数调用部分代码:

int main(){char str[64] = "\nAT+CSPN \n ATTF:2\n";int val;const char *dida;dida = vip_str_str_len(str, "ATTF", 12);printf("dida = %s\n", dida);sscanf(dida, "ATTF:%d", &val);printf("val = %d\n", val);return 0;
}

编译运行结果:

三、常见的一些坑

1. sscanf编译报警告,运行报段错误Segmentation fault

错误原因:sscanf使用时,要用地址,而不是值,如下图就会报错。

解决办法:

val改为&val即可。

这篇关于例程三、c语言 字符串匹配 sscanf 字符串查找 返回指针地址 段错误Segmentation fault的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524383

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初