gpt4 book ai didi

c - strtok 返回太多字符串

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:15 25 4
gpt4 key购买 nike

我正在开发一个程序,它是一种设计用于在各种服务器上运行的心跳程序。下面重现的相关函数检索“ friend ”列表,并针对列表中的每个“ friend ”执行一次握手操作(通过 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) ;
}

...我认为在这一点上并不太复杂。而且我看不出有任何改变值(value)观的余地。但是日志文件揭示了这里的问题:

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

结尾

尝试

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

替代品。使用 calloc 分配 my_friends

关于c - strtok 返回太多字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11411285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com