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

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return