2015-11-30 32 views
-3

我有以下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)将时间以分钟为单位转换为小时。

+8

我敢打赌,你回本地字符数组(坏主意),但它是不可能知道,直到您发布实际的源代码。 – keithmo

+4

也许你的get_time函数不是[reentrant](https://en.wikipedia.org/wiki/Reentrancy_(computing))。我们可以看到它的代码吗?你的get_time()存储它返回的字符串在哪里? – nos

+0

get_time正在返回一个全局char数组。 char * get_time(int tval)//将时间以分钟为单位转换为小时 – TinTop

回答

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); 

由于strdup()不是标准C,对于完整性找到低于本土实现:

#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; 
} 
+0

“最后”在这种情况下有点误导。 – StoryTeller

+0

@StoryTeller:错,为什么? – alk

+0

感谢alk.I应该改变我的代码,就像你指出的那样。目前我正在使用两个printfs。 – TinTop

相关问题