例程三、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

相关文章

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进