printf("token" #N " = %d\n", token##N)
时间: 2023-07-29 10:08:35 浏览: 89
这段代码使用了字符串连接运算符 `#` 和标记粘贴运算符 `##`。它的作用是在编译时将 `token` 和 `N` 连接在一起,形成一个新的标识符,并将其作为字符串和整数值打印出来。
假设 `N` 的值为 `42`,那么宏展开后的代码将会是:
```c
printf("token" "42" " = %d\n", token42);
```
然后,`printf` 函数就会打印出类似于 `"token42 = %d"` 这样的字符串,以及 `token42` 的值。
请注意,这段代码只是一个示例,实际上需要定义和初始化 `token42` 变量才能正确运行。
相关问题
这是我的程序: void getSoftVersion(char *major, char *minor, char *patch, char *custom) { int data = 0; char version[48]; char* token = NULL; *custom = 0; mkSoftVersion(version); printf("version:%s\n", version); token = strtok(version, "B(build"); if(token == NULL) { printf("11111111111\n"); sscanf(version, "V%d.%d.%d.%dC(build %d)", major, minor, patch, custom, &data); } else { printf("2222222222\n"); sscanf(version, "V%d.%d.%dB(build %d)", major, minor, patch, &data); } printf("major:%d, minor:%d, patch:%d, custom:%d,\n", *major, *minor, *patch, *custom); return; } 结果: version:V2.0.1.1C(build 230524) 2222222222 major:2, minor:0, patch:1, custom:0, 为什么这个时候无法进入if(token == NULL)这个条件?
这个问题可能是因为在使用`strtok()`函数时,你没有考虑到版本号中可能包含的空格字符导致分割出错。
你可以尝试使用`strchr()`函数来查找字符串中特定字符的位置,然后再使用`sscanf()`函数来解析版本号。具体代码如下:
```
void getSoftVersion(char *major, char *minor, char *patch, char *custom) {
int data = 0;
char version[48];
*custom = 0;
mkSoftVersion(version);
printf("version:%s\n", version);
char* token = strchr(version, 'B');
if (token == NULL) {
printf("11111111111\n");
sscanf(version, "V%d.%d.%d.%dC(build %d)", major, minor, patch, custom, &data);
} else {
printf("2222222222\n");
sscanf(version, "V%d.%d.%d%dB(build %d)", major, minor, patch, custom, &data);
}
printf("major:%d, minor:%d, patch:%d, custom:%d,\n", *major, *minor, *patch, *custom);
return;
}
```
这里使用了`strchr()`函数来查找字符串中第一个'B'字符的位置,然后根据不同的情况使用不同的格式字符串解析版本号。
#include <stdio.h> #include <stdlib.h> #include <string.h> unsigned int GetIpv4(char *ipStr) { unsigned int ip = 0; unsigned int octet; int shift = 0; char * token = strtok(ipStr,"."); while (token != NULL && shift <= 24) { octet = atoi(token); ip |= (octet << shift); shift += 8; token = strtok(NULL, "."); } return ip; } int main() { char *MyIp = "192.168.28.251"; unsigned int IP = GetIpv4(MyIp); printf("IP = 0x%08x\n", IP); return 0; },此程序中,strtok报错
在你的代码中,`strtok`函数可能会报错,这是因为 `strtok` 函数在每次调用时都会修改传入的字符串,而你传入的是一个指向常量字符串的指针。为了解决这个问题,你可以将 `MyIp` 改为一个可修改的字符数组,如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned int GetIpv4(char *ipStr)
{
unsigned int ip = 0;
unsigned int octet;
int shift = 0;
char * token = strtok(ipStr,".");
while (token != NULL && shift <= 24)
{
octet = atoi(token);
ip |= (octet << shift);
shift += 8;
token = strtok(NULL, ".");
}
return ip;
}
int main() {
char MyIp[] = "192.168.28.251";
unsigned int IP = GetIpv4(MyIp);
printf("IP = 0x%08x\n", IP);
return 0;
}
```
通过将 `MyIp` 定义为字符数组,而不是指向常量字符串的指针,你就可以在 `strtok` 函数中传递可修改的字符串了。这样就能够避免 `strtok` 函数报错的问题。
阅读全文