我有以下printf
语句打印函数的输出:
printf("\nStart-Time %s,End-Time %s",
get_time(myfields[i].start_mn),
get_time(myfields[i].end_mn));
在语句中,使用不同的参数调用get_time
函数两次。但是,即使该函数在两次调用中返回不同的字符串,printf
也仅打印第二次调用的第一次调用的返回值。我已经为函数返回变量和函数本身尝试了volatile
关键字,但输出仍然是相同的。
但是,如果我将printf
语句拆分为两个printf
个字符以分别打印值,则会打印出预期的不同值。
所以任何人都可以向我指出这里发生了什么以及这样做的正确方法是什么?
[评论更新:]
get_time
正在返回一个全局char
数组。 char *get_time(int tval)
将时间以分钟转换为小时。
答案 0 :(得分:3)
所以任何人都可以向我指出这里发生了什么以及这样做的正确方法是什么?
对get_time()
的每次调用都将相同的地址返回到同一个缓冲区,然后传递给printf()
,printf()
在这个缓冲区中找到最后放入的内容,其中包含"最后"在"最后的时间"。
要解决此问题,请创建临时缓冲区以传递给char * p1 = strdup(get_time(...));
char * p2 = strdup(get_time(...));
printf("\nStart-Time %s,End-Time %s", p1, p2);
/* Free the temporary buffers. */
free(p1);
free(p2);
:
get_time()
如果您知道#define GET_TIME_LEN_MAX 32
...
char b1[GET_TIME_LEN_MAX];
char b2[GET_TIME_LEN_MAX];
strcpy(b1, get_time(...));
strcpy(b2, get_time(...));
printf("\nStart-Time %s,End-Time %s", b1, b2);
提前返回的最大大小,则会采用更简单的方法:
#define GET_TIME_LEN_MAX 32
...
/* Define buffers and initialise them to ALL zeros. */
char b1[GET_TIME_LEN_MAX] = "";
char b2[GET_TIME_LEN_MAX] = "";
strncpy(b1, get_time(...), GET_TIME_LEN_MAX - 1);
strncpy(b2, get_time(...), GET_TIME_LEN_MAX - 1);
printf("\nStart-Time %s,End-Time %s", b1, b2);
后一个例子的安全版本:
#include <stdlib.h> /* for malloc() */
#include <string.h> /* for strcpy() */
char * strdup(const char * s)
{
char * p = NULL;
if (NULL != s)
{
p = malloc(strlen(s) + 1);
if (NULL != p)
{
strcpy(p, s);
}
}
return p;
}
由于strdup()
不是标准C,为了完整性,请在下面找到一个自行开发的实现:
<div class="container-fluid">
<div class="panel with-nav-tabs panel-success" style="margin-bottom: 1px; padding-bottom: 1px;">
<div class="row" style="margin-bottom: 1px; padding-bottom: 1px;">
<div class="col-md-4" style="margin-bottom: 1px; padding-bottom: 1px;">
<div id="tabFilters" class="panel-heading" style="margin-bottom: 1px; padding-bottom: 1px;">
<ul class="nav nav-tabs">
<li class="active"><a href="#all" data-toggle="tab" onclick="changeFilter('All');">All</a></li>
<li><a href="#atRisk" data-toggle="tab" onclick="changeFilter('atRisk');">At Risk</a></li>
<li><a href="#ECE" data-toggle="tab" onclick="changeFilter('ECE');">ECE</a></li>
<li><a href="#ESL" data-toggle="tab" onclick="changeFilter('ESL');">ESL</a></li>
<li><a href="#Gap" data-toggle="tab" onclick="changeFilter('Gap');">Gap</a></li>
<li><a href="#LEP" data-toggle="tab" onclick="changeFilter('LEP');">LEP</a></li>
<li><a href="#sec504" data-toggle="tab" onclick="changeFilter('sec504');">Section 504</a></li>
</ul>
</div>
</div>
</div>
<div class="panel-body scrollHorizontal">
<div class="tab-content">
<div class="tab-pane fade in active" id="all">
<asp:PlaceHolder ID="phStudMthAll" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="atRisk">
<asp:PlaceHolder ID="phStudMthAtRisk" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="ECE">
<asp:PlaceHolder ID="phStudMthECE" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="ESL">
<asp:PlaceHolder ID="phStudMthESL" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="Gap">
<asp:PlaceHolder ID="phStudMthGap" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="LEP">
<asp:PlaceHolder ID="phStudMthLEP" runat="server"></asp:PlaceHolder>
</div>
<div class="tab-pane fade" id="sec504">
<asp:PlaceHolder ID="phStudMthSec504" runat="server"></asp:PlaceHolder>
</div>
</div>
<div>
<table class="no-result" style="width: 1000px; align-content: center">
<tr>
<td style="font-size: 30px; font-weight: bolder; color: red">No Results Found</td>
</tr>
</table>
</div>
</div>
</div>
</div>