[正则表达式]

1.ssacnf函数 

   一、描述

sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。

sscanf的原型

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);

str:待解析的字符串;

format:字符串格式描述;

其后是一序列数目不定的指针参数,存储解析后的数据(与scanf函数后面类似).。

二、示例用法
1. sscanf的基本用法
整形数转换

int year, month, day;
 
int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);

输出结果:

converted=3, year=2019, month=11, day=03

"%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。

例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为"%04d%02d",那么sscanf将只返回2,day的数值不会被sscanf更改。

浮点数转换

double longitude, latitude;
int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);

输出结果:

converted=2, longitude=113.123456789, latitude=31.123457

sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。

2. sscanf的高级用法
数字+字符串

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);
printf("str=%s/n", str);

输出结果:

str=123456

上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制)。

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9a-z]", str);
printf("str=%s/n", str);

输出结果:

str=123456abcdedf

在格式[]中增加了a-z的描述。

使用^示例:

char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);
printf("str=%s/n", str);

输出结果:

str=123456

在[]中增加表示相反的意思,上面的[a-z]表示一个不包含任何a-z之间的字符串。

使用*的例子:

char str[32] = "";
int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
printf("ret=%d, str=%s/n",ret, str);

输出结果:

ret=1, str=abcdedf

加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果。如上面的例子中,我们就只使用了str一个参数存放%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据。

2.sprintf()函数

sprintf函数调用的主要用途就是把一个字符串放在一个已知的字符数组里去。其实这是一个很常用的库函数,在解决某些OJ题的时候会经常用到它来帮助实现字符串的转移和储存。这里我就在简单的介绍一下其用法。

int sprintf(char *string, char *format [,argument,...]);

第一个参数:(buffer)
这个参数就是接收字符串的字符数组。其大小必须要大于所接收的字符串的大小,否则的话会有空间不够从而导致内存溢出的风险。(这里比较大小时还要考虑到字符串最后的 ‘\0’)

第二个参数:(format)
这个参数就是要传的字符串了。

其余参数:
剩下的参数其实算是对第二个参数format的补充,可有可无,视情况而定。

 

 

有多个参数:

 

 

这里的字符ch和整数num都可以对字符串进行补充,当然也可以是字符串等等...

第一个参数的注意事项:
除了上文提到的比较第一个参数和第二个参数的大小问题,还要注意当你想要在一个字符数组的某个位置开始时,那么第一个参数就要传对应位置的地址。

图解:

 

 

 这里的字符ch和整数num都可以对字符串进行补充,当然也可以是字符串等等...

第一个参数的注意事项:

除了上文提到的比较第一个参数和第二个参数的大小问题,还要注意当你想要在一个字符数组的某个位置开始时,那么第一个参数就要传对应位置的地址。

图解:

 

 

 

 


 

sprintf函数返回值:
函数如果调用成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

图解:

 

 3.字符串转数值,数值转字符串 的一些函数

 

 4.printf()和scanf()函数中*的使用

一、printf和scanf中* 和#的作用

scanf
*在scanf中起到过滤的作用,就比如写入了三个数,而就只想要中间的数,那我们就可以应用 *

int main()
{
    int b;
    scanf("%*d %d %*d",&b);
    printf("%d",b);
    return 0;
}

 

 下面还有一些相关的例子

int main()
{
    int a = 1, b = 1;
    //输入2 2 
    scanf("%d %*d",&a,&b);
    printf("%d %d\n",a,b);
    //输入 2 a 2
    a = 1, b = 1;
    scanf("%d %*c %d",&a,&b);
    printf("%d %d\n",a,b);
    a = 1, b = 1;
    //输入 2 abc 2    
    scanf("%d%*s%d",&a,&b);
    printf("%d %d",a,b);
    return 0;
}

 

 printf
*在printf中类似的用法我们也是见过的,和%5d的用法就很类似,但是 *的用法更加的灵活,它们都是用来限制输出宽度的,*的方法更加灵活,为动态输出格式。

int main()
{
    int a = 2;
    float b = 12.45f;
    char* p = "abcdef";
    printf("%*d\n",10,a);
    printf("%*.*f\n",0,5,b);
    printf("%*.*s",10,3,p);
    return 0;
}

 

 

%*d和%5d的用法是完全一样的,%*.*f和%10.5f也是一样的,

小数点前面的为整体要输出多少位,意味着至少输出*个字符,其中“.”和“+”“-”也算入其中,而小数点后面的为小数点要保留多少位,意味着最多只能输出 * 个字节。

int main()
{
    char* p = "abcdef";
    printf("%3s\n",p);
    printf("%*s\n",3,p);
    printf("%.*s",3,p);
    return 0;
}

 

 

二、printf和scanf中# 的作用

#可以在数值前面输出对应的进制符号

题目:十进制整数1234对应的八进制和十六进制(字母大写),用空格分开,并且要求,在八进制前显示前导0,在十六进制数前显示前导0X。

下面这也就是答案了

#include<stdio.h> 
int main()
 { 
     printf("%#o %#X", 1234, 1234);
     return 0;
 }

 

 例子:

#include<stdio.h> 
int main()
{
    //printf("%#o\n%#X", 1234, 1234);
    printf("%o,%#o,%x,%#x",10,10,10,10);
    return 0;
}

 

 5.math.h函数库

1.绝对值

1.计算双精度浮点数x的绝对值用fabs()
函数原型:

double fabs(double x)

 

2.计算整数x的绝对值用abs()
函数原型:

int abs(int x)

3.求复数的绝对值

函数原型

double cabs(struct complex znum)

 

参数说明:zuum为用结构struct complex表示的复数,定义如下:

struct complex
              {
                double m;
                double n;
              }
#include <stdio.h>
#include <math.h>
int main()
{
    struct complex z;
    double val;
    z.x=2.0;
    z.y=1.0;
    val=cabs(z);
    printf("The absolute value of %.2lfi %.2lfj is %.2lf",z.x,z.y,val);
    return 0;
}

 

2.取整和取余

3.三角函数

4.反三角函数
5.双曲三角函数
6.指数和对数

1.计算x^y(x的y次方)用pow()
函数原型:

double pow(double x,double y)

2.计算e^x用exp()
函数原型:

double exp(double x)

3.计算x的平方根用sqrt()

函数原型:

double sqrt(double x)

 

7.标准化浮点数

7.标准化浮点数

函数原型:

double modf (double x, double *ip);

 


函数功能:将参数的整数部分通过指针回传, 返回小数部分,整数部分保存在*ip中

函数原型:

 double ldexp(double x,int exponent)

 


函数功能: 计算x*2的exponent次幂,即2*pow(2,exponent)的数值

 

8.多项式
9.数学错误计算处理

别的函数具体原型下次补充,要睡觉了zZZ