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函数问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的malloc函数的使用?

c语言的二进制数值如何直接输出?

c语言中的取整函数int语句怎么用啊?

c语言中的取整函数int语句怎么用?

pythonint转换成c_uint

go语言中int、int32、int64转string