c语⾔写函数参数类型是字符串怎样表⽰出,C语⾔的可变参数
与字符的输⼊输出...
⼀.可变参数的处理
当我们在写程序的时候,如果传⼊的参数是确定的,那么依次处理就⾏;如果参数的长度不确定,该怎么处理呢?
在C中,当我们⽆法列出传递函数的所有实参的类型和数⽬时,可以⽤省略号指定参数表。如 void func (...)
另外C语⾔提供了⼀套标准的处理⽅法。
先来看看下⾯的例⼦。(该函数实现的是:将不定长度的字符输出)
#include "stdarg.h"
void Dug_Printf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
fflush(stdout);
}
来⼀步步分析下每段代码的含义:
(1)⾸先定义⼀个va_list型的变量,这个变量是指向参数的指针,也就是指向参数列表⾥的"...";VA_LIST 是在C语⾔中解决变参问题的⼀组宏。
(2)va_start(args, fmt); 和va_end(args); 是⼀组;前者对定义的参数 进⾏初始化,让它指向可变参数表⾥⾯的第⼀个参数;后者在获取所有的参数之后,将定义的参数指针关掉,以免发⽣危险。
(3)vprintf 的作⽤是将可变参数列表的格式化数据打印到stdout。printf怎么输出字符
(4)fflush(stdout):清空输出缓冲区,并把缓冲区内容输出。
⼆. c语⾔常⽤的字符输⼊输出函数(printf,sprintf,sscanf)
1. int printf(const char *format, ...);
函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。
printf()函数的调⽤格式为:
printf("", );
其中格式化字符串包括两部分内容: ⼀部分是正常字符, 这些字符将按原样输出; 另⼀部分是格式化规定字符, 以"%"开始, 后跟⼀个或⼏个规定字符,⽤来确定输出内容格式。
通常我们会将它重定义到串⼝,⽤于打印调试信息或者输出关键信息。
如下是stm32上串⼝使⽤printf的⽰例
int fputc(int ch,FILE *f)
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
{
}
return ch;
}
除了上⾯的printf,我发现在⼯作中最常⽤到的就是处理字符串的sprintf和sscanf
2. int sprintf(char *buffer, const char *format, [argument]…)
作⽤是将格式化的数据写⼊字符串。
参数:
(1)buffer:是char类型的指针,指向写⼊的字符串指针;
(2)format:格式化字符串,即在程序中想要的格式;
(3)argument:可选参数,可以为任意类型的数据;
函数返回值:buffer指向的字符串的长度。
如下:
#includeint main()
{
char buffer[10];
char *a = “1234”;
char *b = “abcd”;
sprintf(buffer, ”%s%s”, a, b);
printf(”buffer=%s\n”, buffer);
return 0;
}
输出结果:buffer =1234abcd
3. int sscanf(const char *str, const char *format,......);
作⽤是:从⼀个字符串中读进于指定格式相符的数据。利⽤它可以从字符串中取出整数、浮点数和字符串。str:存储的数据
format:窗体控件字符串。
sscanf有很多应⽤的场景:
//读取时间
#include#includeint main()
{
int year, month, day, hour, minute, second;
sscanf("2019-12-12 11:50:24","%d-%d-%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second); printf("time=%d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second);
return 0;
}
//取指定长度的字符串。如在下例中,取最⼤长度为4字节的字符串。
sscanf("123456","%4s",str);
printf("str=%s",str);
结果: 1234
sscanf还可以匹配简单的正则表达式提取数据。
//取到指定字符集为⽌的字符串。如在下例中,取遇到⼤写字母为⽌的字符串。
sscanf("1111111abcdedfBCDEF","%[^A-Z]",str);
printf("str=%s",str);
结果: str=1111111abcdedf
其中:% [^A-Z]表⽰⼀读⼊A-Z中的字符就结束读⼊;那么scanf("%*[^A-Z]")表⽰⼀读取到⾮A-Z的字符就结束读⼊。关于字符串的读取和写⼊就先写这么多,以后遇到不熟悉的继续添加。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。