void getCmdResult(const char* cmd, char** resultbuf, size_t* bufsize) { FILE* fp = popen(cmd, "r"); if (fp) { *resultbuf = malloc(*bufsize); fgets(*resultbuf, *bufsize, fp); pclose(fp); } } HUAYI_BOOL TcpObtainServervalue(int count, ...) { char* resultbuf = NULL; size_t bufsize = 1024; char cmd[TEMP_STR_LEN]; int counter = 0; va_list args; va_start(args, count); strcpy(cmd, "cat /tmp/returnValue"); do { if (counter > 10) return HUAYI_FALSE; else if (counter) sleep(1); if (resultbuf) free(resultbuf); getCmdResult(cmd, &resultbuf, &bufsize); counter++; } while (!strlen(resultbuf)); char* token = strtok(resultbuf, " "); int i = 0; while (token != NULL && i < count) { char* str = va_arg(args, char*); strcpy(str, token); token = strtok(NULL, " "); i++; } va_end(args); unlink("/tmp/returnValue"); free(resultbuf); return HUAYI_TRUE; } char name1[128]; char name2[128]; char name3[128]; TcpObtainServervalue(3,name1,name2,name3); printf("%s,%s,%s",name1,name2,name3);strtok分割不确定是空格分割还是换行分割
时间: 2024-04-09 15:33:06 浏览: 62
在你的代码中,`strtok` 函数使用空格作为分隔符来分割字符串。所以在这种情况下,`strtok` 会将 `resultbuf` 字符串按照空格进行分割。
然而,你可能需要注意的是,`fgets` 函数读取的内容会包含换行符。所以如果 `resultbuf` 字符串以换行符结尾,那么 `strtok` 在分割时会将换行符也作为分隔符,导致分割结果不符合预期。
如果你希望在 `strtok` 中同时支持空格和换行符作为分割符,你可以修改代码如下:
```c
char* token = strtok(resultbuf, " \n"); // 使用空格和换行符作为分隔符
```
这样,`strtok` 就会按照空格和换行符进行分割。
相关问题
void getCmdResult(const char* cmd, char** resultbuf, size_t* bufsize) { FILE* fp = popen(cmd, "r"); if (fp) { *resultbuf = malloc(*bufsize); fgets(*resultbuf, *bufsize, fp); pclose(fp); } } HUAYI_BOOL checkFileExistsAndNotEmpty(const char* filename) { // 检查文件是否存在 if (access(filename, F_OK) == -1) { return HUAYI_FALSE; } // 检查文件大小是否为0 struct stat fileStat; if (stat(filename, &fileStat) == -1) { return HUAYI_FALSE; } if (fileStat.st_size == 0) { return HUAYI_FALSE; } return HUAYI_TRUE; } void assignValue(void* arg, const char* token) { if (arg == NULL || token == NULL) { return; } if (strncmp(token, " ", 1) == 0) { return; } if (isdigit(token[0])) { int* intValue = (int*)arg; *intValue = atoi(token); } else { char* strValue = (char*)arg; strcpy(strValue, token); } } HUAYI_BOOL TcpObtainServervalue(int count, ...) { char* resultbuf = NULL; size_t bufsize = 1024; char cmd[TEMP_STR_LEN]; int counter = 0; va_list args; va_start(args, count); strcpy(cmd, "cat /tmp/returnValue"); do { if (counter > 10) { return HUAYI_FALSE; } else if (counter) { sleep(1); } if (resultbuf) { free(resultbuf); } getCmdResult(cmd, &resultbuf, &bufsize); counter++; } while (!checkFileExistsAndNotEmpty("/tmp/returnValue")); char* token = strtok(resultbuf, " "); int i = 0; while (token != NULL && i < count) { void* arg = va_arg(args, void*); assignValue(arg, token); token = strtok(NULL, " "); i++; } va_end(args); unlink("/tmp/returnValue"); free(resultbuf); return HUAYI_TRUE; }char name[3][128;]TcpObtainServervalue(3, name[1], name[2], name[0]);
这段代码是一个函数`TcpObtainServervalue`的实现,该函数通过执行系统命令获取服务器的返回值,并将返回值分配给传入的参数。具体的实现逻辑如下:
1. 首先定义了一个指针`resultbuf`和一个变量`bufsize`,用于存储命令执行的结果和结果的大小。
2. 创建一个文件指针`fp`,通过调用`popen`函数执行指定的命令,并将结果写入`fp`。
3. 如果`fp`指针不为空,说明命令执行成功,接着动态分配内存给`resultbuf`,大小为`bufsize`。
4. 调用`fgets`函数从`fp`中读取命令执行结果,并将结果存储在`resultbuf`中。
5. 关闭文件指针`fp`,释放内存。
6. 接下来定义了一个函数`checkFileExistsAndNotEmpty`,用于检查文件是否存在且大小不为0。首先使用`access`函数检查文件是否存在,如果不存在则返回假。然后使用`stat`函数获取文件的状态信息,如果获取失败则返回假。最后判断文件大小是否为0,如果为0则返回假,否则返回真。
7. 定义了一个函数`assignValue`,用于根据传入的参数类型将字符串值转换为相应的类型。首先检查传入的参数是否为空,如果为空则直接返回。然后判断传入的字符串是否以空格开头,如果是则返回。接着判断字符串的首字符是否为数字,如果是则将字符串转换为整数并赋值给指针类型的参数,否则将字符串复制给指针类型的参数。
8. 最后是函数`TcpObtainServervalue`的实现。函数接受一个可变参数的个数和对应个数的参数,其中第一个参数为个数,后续参数为需要分配值的变量。首先定义了一个字符数组`cmd`,用于存储执行的命令。然后使用`va_start`宏初始化可变参数列表。
9. 将命令字符串`"cat /tmp/returnValue"`复制给`cmd`。
10. 进入一个循环,循环条件是文件`/tmp/returnValue`不存在或者为空。在每次循环中,首先判断循环次数是否超过10次,如果超过则返回假。然后判断循环次数是否大于0,如果大于0则调用`sleep`函数暂停1秒。接着释放`resultbuf`的内存,然后调用`getCmdResult`函数执行命令,并将结果赋值给`resultbuf`和`bufsize`。循环次数加1。
11. 在循环结束后,使用`strtok`函数将结果字符串分割成多个子字符串,以空格作为分隔符。然后依次遍历每个子字符串,并将其赋值给对应的参数。
12. 最后调用`va_end`宏结束可变参数列表,删除临时文件`/tmp/returnValue`,释放`resultbuf`的内存,返回真。
13. 最后一行代码是调用`TcpObtainServervalue`函数,并传入3个参数`name[1]`、`name[2]`、`name[0]`。
error: conflicting types for 'inet_ntop'; have 'const char *(int, cons t void *, char *, socklen_t)' {aka 'const char *(int, const void *, char *, int)'} 16 | const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
这个错误的意思是 inet_ntop 函数的定义与之前的声明不一致,导致类型冲突。一种可能的解决办法是,找到之前的声明,查看其参数类型是否与定义中的一致。如果不一致,需要将其修改为与定义一致的类型。如果找不到之前的声明,可以查看相关的头文件,确认其是否包含了正确的声明。
在这个具体的错误信息中,定义中的 socklen_t 类型与之前的声明中的类型不一致,导致冲突。您可以尝试在代码中包含 <sys/socket.h> 头文件,这个头文件中包含了对 inet_ntop 函数的正确声明。例如:
```
#include <sys/socket.h>
```
这个头文件中还包含了其他与网络相关的函数和类型的声明,可以提供更全面的网络编程支持。如果问题仍然存在,您可以尝试在编译命令中指定 -std=c99 选项,这样编译器会使用 C99 标准进行编译,可能会解决一些类型相关的问题。
阅读全文