Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strtok返回的字符串太多_C_Strtok - Fatal编程技术网

C strtok返回的字符串太多

C strtok返回的字符串太多,c,strtok,C,Strtok,我正在开发一个程序,它是一种心跳信号,设计用于在各种服务器上运行。下面重现的函数检索“朋友”列表,并对列表中的每个“朋友”执行握手操作(通过ping_和_报告,未显示) 问题是,在第一次调用这个例程时,strtok_r返回的字符串似乎比源代码中的字符串多,我无法确定原因。守则: void pingServerList(int dummy) { char *p ; char *my_friends ; char *nextSvr, *savePtr ; ; char

我正在开发一个程序,它是一种心跳信号,设计用于在各种服务器上运行。下面重现的函数检索“朋友”列表,并对列表中的每个“朋友”执行握手操作(通过ping_和_报告,未显示)

问题是,在第一次调用这个例程时,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系统上,失败的方式完全相同。)

当你写这篇文章时

strncpy(my_friends, p, len) ;
您没有确保
my_friends
以\0结尾

试一试

alt.当你写这篇文章时,使用calloc分配我的朋友

strncpy(my_friends, p, len) ;
您没有确保
my_friends
以\0结尾

试一试


alt.如果调用
get_server_list()
p
NULL
my_friends
是一个未初始化的指针,传递给
strtok_r()
my_friends=strdup(p)也是每个“friends”地址的strdup。你泄漏了分配给我的朋友集服务器的内存。列表返回一个指向静态字符串的指针。它从不为空,但可能为空。但是你是对的-右大括号应该向下移动-或者NULL p应该导致失败。免费的(我的朋友们)在那里,但稍后。我不知道strdup()的事!谢谢如果调用
get_server_list()
p
NULL
my_friends
是一个未初始化的指针,传递给
strtok_r()
my_friends=strdup(p)也是每个“friends”/address的strdup。你泄漏了分配给我的朋友集服务器的内存。列表返回一个指向静态字符串的指针。它从不为空,但可能为空。但是你是对的-右大括号应该向下移动-或者NULL p应该导致失败。免费的(我的朋友们)在那里,但稍后。我不知道strdup()的事!谢谢+1.我想你找到了确切的错误地点@Dennis-strncpy()函数最多将s2中的n个字符复制到s1中。如果s2的长度小于n个字符,则s1的其余部分将填充“\0”个字符。否则,s1不终止。在本例中,len等于s2中的字符数,因此s1不会以空结尾。
strncpy(my_friends,p,len)[len-1]
是一个非常丑陋的代码结构。这不是-使用
我的朋友[len-1]='\0'
或干脆
我的朋友=strdup(p)您是否缺少alloc()表示长度为+1的事实?+1。我想你找到了确切的错误地点@Dennis-strncpy()函数最多将s2中的n个字符复制到s1中。如果s2的长度小于n个字符,则s1的其余部分将填充“\0”个字符。否则,s1不终止。在本例中,len等于s2中的字符数,因此s1不会以空结尾。
strncpy(my_friends,p,len)[len-1]
是一个非常丑陋的代码结构。这不是-使用
我的朋友[len-1]='\0'
或干脆
我的朋友=strdup(p)您是否忽略了alloc()的长度为+1的事实?