本文主要是介绍例程三、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;
}
报错退出后,编译,运行:
二、常见一些用法
-
忽略前面字符串
#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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!