C语言中的sprint函数问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的sprint函数问题相关的知识,希望对你有一定的参考价值。
这一串代码是多次启动计算器,代码无错误
void main()
int num;
char str[50];
scanf("%d", &num);
sprintf(str, "for /l %%i in (1,1,%d) do start calc", num);
system(str);
system("pause");
问题是第五行sprintf中的表达式的意思,比如那个/l 跟%%i意义是什么,期望回答
sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,具体功能如下所示:
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串。
举例如下所示:
1 char str[256] = 0 ;
2 int data = 1024;
3 //将data转换为字符串
4 sprintf(str,"%d",data);
5 //获取data的十六进制
6 sprintf(str,"0x%X",data);
7 //获取data的八进制
8 sprintf(str,"0%o",data);
9 const char *s1 = "Hello";
10 const char *s2 = "World";
11 //连接字符串s1和s2
12 sprintf(str,"%s %s",s1,s2);
3、sscanf函数
sscanf函数原型为int sscanf(const char *str, const char *format, ...)。将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。具体功能如下:
(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
(2)取指定长度的字符串
(3)取到指定字符为止的字符串
(4)取仅包含指定字符集的字符串
(5)取到指定字符集为止的字符串
sscanf可以支持格式字符%[]:
(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符
(3),: 范围可以用","相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %[^ ](注意^后面有一个空格!)
解析网址的例子如下所示:
1 const char *s = "http://www.baidu.com:1234";
2 char protocol[32] = 0 ;
3 char host[128] = 0 ;
4 char port[8] = 0 ;
5 sscanf(s,"%[^:]://%[^:]:%[1-9]",protocol,host,port);
6
7 printf("protocol: %s\\n",protocol);
8 printf("host: %s\\n",host);
9 printf("port: %s\\n",port);
10
4、snprintf函数
snprintf函数是sprintf函数的更加安全版本,考虑到字符串的字节数,防止了字符串溢出。函数形式为:int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);。最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
5、测试程序
本次采用ip地址和整型之间的转换,mac地址转换作为测试程序,整个程序如下所示:
1 #include <stdio.h>
2 #include <assert.h>
3
4 #define IP_STR_LEN 18
5 #define MAC_STR_LEN 18
6 #define MAC_BIT_LEN 6
7 #define LITTLE_ENDIAN 0
8 #define BIG_ENDIAN 1
9
10 typedef unsigned char uchar;
11 typedef unsigned int uint;
12
13 int big_little_endian()
14
15 int data = 0x1;
16 if (*((char*)&data) == 0x1)
17 return LITTLE_ENDIAN;
18 return BIG_ENDIAN;
19
20
21 uint ipstr2int(const char * ipstr)
22
23 assert(ipstr);
24 uint a,b,c,d;
25 uint ip = 0;
26 sscanf(ipstr,"%u.%u.%u.%u",&a,&b,&c,&d);
27 a = (a << 24) ;
28 b = (b << 16) ;
29 c = (c << 8) ;
30 d = (d << 0) ;
31 ip = a | b | c | d;
32 return ip;
33
34
35 char *int2ipstr(const uint ip, char *ipstr, const uint ip_str_len)
36
37 assert(ipstr);
38 if (big_little_endian() == LITTLE_ENDIAN)
39 sprintf(ipstr,"%u.%u.%u.%u",
40 (uchar)*((char*)(&ip)+3),
41 (uchar)*((char*)(&ip)+2),
42 (uchar)*((char*)(&ip)+1),
43 (uchar)*((char*)(&ip)+0));
44 else
45 sprintf(ipstr,"%u.%u.%u.%u",
46 (uchar)*((char*)(&ip)+0),
47 (uchar)*((char*)(&ip)+1),
48 (uchar)*((char*)(&ip)+2),
49 (uchar)*((char*)(&ip)+3));
50
51 return ipstr;
52
53
55 char *mac2str(const unsigned char *mac,char *mac_str,const uint mac_str_len)
56
57 assert(mac_str);
58 sprintf(mac_str,"%02X-%02X-%02X-%02X-%02X-%02X",
59 mac[0],mac[1],mac[2],
60 mac[3],mac[4],mac[5]);
61
62
63 int main()
64
65 char ip_str[IP_STR_LEN] = 0;
66 char mac_str[MAC_STR_LEN] = 0;
67 unsigned char mac[MAC_BIT_LEN] = 0XEF,0XAD,0XF4,0X4F,0XAA,0X0F;
68 const char *ipstr = "10.0.3.193";
69 unsigned int ip;
70 int2ipstr(167773121,ip_str,IP_STR_LEN);
71 mac2str(mac,mac_str,MAC_STR_LEN);
72 ip = ipstr2int(ipstr);
73 printf("%s\\n",ip_str);
74 printf("%s\\n",mac_str);
75 printf("ip:%u\\n",ip);
76 return 0;
77
程序执行结果如下所示:
参考技术A 原型int sprintf( char *buffer, const char *format, [ argument] … );str是将要写入的字符串
/l 在C语言里面它还是/l没有变
%%i是%i的意思 在字符串里面要是想输出%,必须用%%
%d对应着num
比如你输入5
str里面就是for /l %i in (1.1.5) do start calc
system(str)就是把这个字符串当成一个命令发送给cmd本回答被提问者和网友采纳 参考技术B sprintf的意思是将“”内的内容按照格式字符写入str,是严格按照数据格式转换成了字符串,比如这里的num是int类型,给他赋值是1,然后str的结果就是"for /l %i in (1,1,1) do start calc"这里的%d的值在字符串中显示了,当然/l没有任何意义可言,%%代表了一个%追问
/l无意义那有什么作用呢?for /l %i in (1,1,1) do start calc这句代码意思我不懂啊,do start calc就是打开计算器,那前一句呢?什么意义?
追答可能是str这里要做一个内容的匹配吧,你看看str发给控制台接收之后有什么用呢。
在 jira 的新发布版本下创建新的 sprint
【中文标题】在 jira 的新发布版本下创建新的 sprint【英文标题】:Create new sprint under new release version in jira 【发布时间】:2015-10-21 18:40:38 【问题描述】:我有两个版本 1.5,另一个新版本是 jira 中的 v2.0 版本。 到目前为止,我在 1.5 版中有 16 个 sprint 现在我想在 2.0 版下进行新的 sprint。
我该怎么做?我有什么遗漏或方向错误吗?
【问题讨论】:
16.0 Sprint 低于 1.5 版。现在我想在 2.0 版下添加新的 sprint。我该怎么做? 【参考方案1】:Sprint 用于持续的敏捷开发,其中“发布”与更基本的看板工作流相关,您拥有 WIP(正在进行的工作)工作流,只需将活动的“sprint”发布到发布版本中。
当您使用看板软件开发项目时,它没有遵循 Scrum 敏捷项目工作流模型,因此它用发布代替了“冲刺”。一旦你填写了你的最大 WIP(比如 10 个任务),一旦完成,你就会将完成的工作发布到发布版本中。这与冲刺不同,因为它取决于您的团队允许的工作量。 Sprint 是 JIRA 中 scrum/agile 项目类型的一部分,是针对日期范围运行的。冲刺中任何未完成的工作都将移至下一个冲刺。
如果您谈论的是这些版本,您可以做的是更改您正在使用的项目类型和“版本”而不是版本。
版本跟踪独立于 sprint,并允许您拥有可以针对多个 sprint 进行跟踪的 1.5 和 2.0 版本。对不起我之前的回答。几个产品混合版本和发布。
【讨论】:
Chaseabbot,您说在 x 版本和 y 版本下没有 sprint 之类的东西。它们是作为通用的,没有专门针对每个版本的? Sprint 是一个不同的实体。 您是在谈论看板版本还是“版本”?我会更新我的答案。 我建议在 scrum/agile 项目中使用版本,而不是在看板软件开发中使用版本。这为您提供了更大的灵活性,并可以轻松获得您想要的东西。而且这些报告很容易理解。 Chaseabbot...你以前的回答是 gud .. 它是为 scrum 服务的! ... 泳道如何与 Release 一起使用? 请记住,敏捷软件开发应该是“敏捷的”。所以如果你不喜欢一种做事方式,改变你在 JIRA 中做事的方式是完全可以的!以上是关于C语言中的sprint函数问题的主要内容,如果未能解决你的问题,请参考以下文章