strtok返回太多字符串

时间:2012-07-10 10:22:40

标签: c strtok

我正在开发一种程序,它是一种旨在在各种服务器上运行的心跳。下面再现的有问题的函数检索“朋友”列表,并且对于列表中的每个“朋友”,它执行握手操作(通过ping_and_report,未显示)。

问题是,在第一次调用此例程时,strtok_r似乎返回的字符串多于源中存在的字符串,而我无法确定原因。代码:

void pingServerList(int dummy) {
    char *p ;
    char *my_friends ;
    char *nextSvr, *savePtr ; ;
    char  *separators = ",; \t" ;
    server_list_t *ent = NULL ;
    static long round_nbr = 0  ;
    unsigned int len ;
    time_t now ;
    char   message[4096] ;
    char   *hex ;

    round_nbr++ ;
    p = get_server_list() ;
    if (p) {
        len =strlen(p) ;
        my_friends = malloc(len+1) ;
        strncpy(my_friends, p, len) ;
        }
    nextSvr = strtok_r(my_friends, separators, &savePtr) ;
    while (nextSvr) {
        // Ensure that nobody messes with nextSvr. . .
        char *workSvr = malloc(strlen(nextSvr) + 1) ;
        strcpy(workSvr, nextSvr) ;
        if (debug) {
            len = strlen(workSvr) * 2 + 3 ;
            hex = malloc(len) ;
            get_hex_val(workSvr, hex, len) ;
            write_log(fp_debug
                    , "Server: %s (x'%s')"
                    , workSvr, hex) ;
            free(hex) ;
            }
        ping_and_report(workSvr, round_nbr) ;
        free(workSvr) ;
        nextSvr = strtok_r(NULL, separators, &savePtr) ;
        }

......在那一点上并不太复杂,我想。我没有看到任何与价值观混淆的空间。但是日志文件显示了这里的问题:

2012-07-09 23:26 Debug activated...
2012-07-09 23:26 get_server_list() returning velmicro, stora-2 (x'76656C6D6963726F2C2073746F72612D32')
2012-07-09 23:26 Server: velmicro (x'76656C6D6963726F')
2012-07-09 23:26 Server: stora-2 (x'73746F72612D32')
2012-07-09 23:26 Server: re (x'726519')

疯狂的是(至少从代码的几次执行中)这只会在第一次调用时失败。调用2-n(其中n为数百)不会出现此问题。

你们中的任何人都会看到我明显缺少的东西吗? (顺便说一句:在使用linux版本的四个不同系统上,这种方式完全相同。)

1 个答案:

答案 0 :(得分:3)

当你写这个

strncpy(my_friends, p, len) ;

您无法确保my_friends以\ 0

结尾

strncpy(my_friends, p, len)[len-1] = '\0';

ALT。使用calloc分配my_friends