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。

(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的字符就结束读入。

关于字符串的读取和写入就先写这么多,以后遇到不熟悉的继续添加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值