sprintf snprintf、scanf sscanf函数使用详解

一、sprintf snprintf函数使用

1、sprintf()

sprintf指的是字符串格式化命令.
函数声明为 int sprintf(char *string, char *format [,argument,…]);
参数:
str为要写入的字符串;
format为格式化字符串,与printf()函数相同;
argument为变量。

sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已, 前者打印到字符串中, 后者则直接在命令行上输出。

1、sprintf()把整数打印到字符串中
如:
sprintf(s, “%d”, 123); //把整数123打印成一个字符串保存在s中
sprintf(s, “%8x”, 4567); //小写16进制,宽度占8个位置,右对齐
2、打印16 进制内容时,通常想要一种左边补0 的等宽格式
sprintf(s, “%08X”, 4567); //产生:“000011D7”
很简单,在表示宽度的数字前面加个0 就可以了。
3、控制浮点数打印格式
浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6 位数字,比如:
sprintf(s, “%f”, 3.1415926); //产生"3.141593"
4、控制打印的宽度和小数位数
”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:
sprintf(s, “%10.3f”, 3.1415626); //产生:" 3.142"
sprintf(s, “%-10.3f”, 3.1415626); //产生:"3.142 "
sprintf(s, “%.3f”, 3.1415626); //不指定总宽度,产生:“3.142”

C语言对数组进行操作时并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统:

#include <stdio.h>
main()
{
    char buf[10];
    sprintf(buf, "The length of the string is more than 10")
    printf("%s", buf);
}

运行结果为:”The length of the string is more than 10“,
同时系统提示程序已经停止。原因就是要写入的字符串的长度超过了buf的长度,造成缓冲区溢出。
使用snprintf()来代替sprintf()将能够很好的解决这个问题。

1、snprintf()

snprintf()函数用于将格式化的数据写入字符串
原型为: int snprintf(char *str, int n, char * format [, argument, …]);
参数: str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。
返回值: 成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。
snprintf()比sprintf()多了一个参数,能够控制要写入的字符串的长度,更加安全,只要稍加留意,不会造成缓冲区的溢出。

 1. #include <stdio.h> 
 2. int main()
 3. {
 4. 	char buffer[50];
 5. 	char* s = "runoobcom";
 6. 	int j = snprintf(buffer, 6, "%s\n", s);// 读取字符串并存储在 buffer 中
 7. 	printf("string:\n%s\ncharacter count = %d\n", buffer, j); // 输出 buffer及字符数
 8. 	 return 0;
 9. }

输出结果

  string:
  abcde
  character count = 10

对于返回值,需要注意的是snprintf的返回值是欲写入的字符串(即源字符串)长度,而不是实际写入的字符串度。如:

char test[8];
int ret= snprintf(test,5,"1234567890");
printf("%d|%s\n",ret,test);
#include <stdio.h>
 
int main () {
  char a[16];
  size_t i;
  char path[216] = {0};
  i = snprintf(a, 13, "%012d", 12345);  // 第 1 种情况
  printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 000000012345
 
  i = snprintf(a, 9, "%012d", 12345);   // 第 2 种情况
  printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 00000001
 
  i = snprintf(path, sizeof(path), "%s/%s.%s.so","/system/lib64/hw/love", "tanghanyue", "default");
  printf("i = %lu, path = %s\n", i, path);    // 输出:i = 43, path = /system/lib64/hw/love/tanghanyue.default.so
  return 0;
}

输出的结果为:
10|1234

二、scanf sscanf函数使用

1、 scanf()

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。
scanf函数的一般形式为:scanf(“格式控制字符串”, 地址表列);
scanf(“%d”,&a);
&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
表示输入数据的类型,其格式符和意义如下
%d: 输入十进制整数
%o: 输入八进制整数
%x: 输入十六进制整数
%u: 输入无符号十进制整数
%f或e: 输入实型数(用小数形式或指数形式)
%c: 输入单个字符
%s: 输入字符串

scanf(“%d %*d %d”,&a,&b);
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
scanf(“%d%d”,&r,&c);
将接受输入 10 20,但遇到 10,20 则失败。

2、 sscanf()

sscanf()的作用: 从一个字符串中读进与指定格式相符的数据.
**定义函数 int sscanf (const char *str,const char * format,…);**函数说明:
sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。
sscanf的具体用法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
int main()
{
     char str[100];
     //用法一:取指定长度的字符串
     sscanf("12345","%4s",str);
     printf("str=%s",str);
     
      //用法二:格式化时间
     int year,month,day,hour,minute,second;
     sscanf("2021/10/18 14:55:34","%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); 
     
     //用法三:读入字符串
     sscanf("12345","%s",str);
     printf("str = %s\n",str);
     
     //用法四:%*d 和 %*s 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
     sscanf("12345acc","%*d%s",str);
     printf("str = %s\n",str);
     sscanf("hello, world", "%*s%s", buf);
     printf("%s\n", buf);
     
     //用法五:取到指定字符为止的字符串。如在下例中,取遇到任意小写字母为止的字符串。
     sscanf("123456abcdedf","%[^a-z]",buf);
     printf("%s\n",buf);
     // %*s表示第一个匹配到的%s被过滤掉,即hello,被过滤了,如果没有空格则结果为NULL。
       
     //用法六:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。
     sscanf("12345+acc121","%[^a-z]",str);
     printf("nstr = %s\n",str);
     
     return 0;

}

输出:
str=1234
time = 2021-10-18 14:55:34
str = 12345
str = acc
world
str = 123456
str = 12345+

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sprintfsnprintf都是C标准库中的字符串处理函数,用于将格式化的字符串输出到字符数组中。 sprintf函数的原型为: ```c int sprintf(char* str, const char* format, ...); ``` 其中,第一个参数是一个字符数组,用于存放输出的字符串;第二个参数是一个格式化字符串,用于指定输出的格式;后面的参数是可选的,用于指定格式化字符串中的占位符。 以下是一个使用sprintf函数的例子: ```c #include <stdio.h> int main() { char str[50]; int num = 123; sprintf(str, "The number is %d", num); printf("%s\n", str); return 0; } ``` 输出结果为: ``` The number is 123 ``` 在这个例子中,我们声明了一个长度为50的字符数组str,用于存放输出的字符串。然后使用sprintf函数将格式化的字符串输出到str中,并将结果打印出来。 snprintf函数的原型为: ```c int snprintf(char* str, size_t size, const char* format, ...); ``` 其中,第一个参数和第二个参数与sprintf函数相同,第三个参数也是格式化字符串,后面的参数也是可选的。与sprintf函数不同的是,在snprintf函数中,我们需要指定输出字符串的长度,以避免输出字符串过长导致数组越界。 以下是一个使用snprintf函数的例子: ```c #include <stdio.h> int main() { char str[10]; int num = 123; snprintf(str, 10, "%d", num); printf("%s\n", str); return 0; } ``` 输出结果为: ``` 123 ``` 在这个例子中,我们声明了一个长度为10的字符数组str,使用snprintf函数将num转换为字符串,并将结果输出到str中。由于我们指定了输出字符串的长度为10,因此snprintf函数最多只会输出10个字符,避免了数组越界的问题。 需要注意的是,使用snprintf函数时,我们需要确保输出字符串的长度足够大,以容纳输出的内容,否则可能会导致输出内容被截断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值