gpt4 book ai didi

C 宏将字符串转换为 pascal 字符串类型

转载 作者:行者123 更新时间:2023-11-30 14:55:21 25 4
gpt4 key购买 nike

我想要一些关于宏的想法,用于将预处理器定义的字符串转换为 pascal 类型字符串,然后能够使用宏来初始化 const char 数组等。

像这样的事情会很棒:

#define P_STRING_CONV(str) ...???...

const char *string = P_STRING_CONV("some string");

struct
{
char str[30];
...
}some_struct = {.str = P_STRING_CONV("some_other_string")};

我已经尝试过这样的事情:

#define DEFINE_PASCAL_STRING(var, str, strlen) struct {uint8_t len; char content[strlen-1];} (var) = {sizeof(str)-1, (str)}

(strlen参数可以删除,但我需要一个定义的大小。)

这工作正常,但不能用于初始化结构中的元素。对于 const char 数组,我需要将其转换为其他变量。

有什么好主意吗?

最佳答案

to convert a string to a pascal string type

要转换字符串文字_Generic复合文字将接近OP目标。

为了获得更好的解决方案,更多详细信息和示例用例将有助于说明 OP 的目标。

#define P_STRING_CONV(X) _Generic((X)+0, \
char *: &((struct {char len; char s[sizeof(X)-1]; }){ (char)(sizeof(X)-1), (X) }).len \
)

void dump(const char *s) {
unsigned length = (unsigned char) *s++;
printf("L:%u \"", length);
while (length--) {
printf("%c", *s++);
}
printf("\"\n");
}

int main(void) {
dump(P_STRING_CONV(""));
dump(P_STRING_CONV("A"));
dump(P_STRING_CONV("AB"));
dump(P_STRING_CONV("ABC"));
return 0;
}

输出

L:0 ""
L:1 "A"
L:2 "AB"
L:3 "ABC"
<小时/>

@Jonathan Leffler建议创建的类似 pascal 的字符串也包含终止空字符。要使用上述代码执行此操作,只需将 sizeof(X)-1 更改为 sizeof(X) 即可。然后,通过访问 pascal_like_string + 1,代码就有了一个指向有效 C 字符串的指针。

<小时/>

(X)+0 将数组类型转换为指针

sizeof(X)-!!sizeof(X) 生成字符串文字的大小,不计算其\0。至少 1 个。

struct {char len; char s[sizeof(X)-!!sizeof(X)]; } 是一个大小合适的类似帕斯卡的结构。

(struct {char len; char s[sizeof(X)-!!sizeof(X)]; }){ (char)(sizeof(X)-1), (X) } 是一个复合文字

<小时/>

以下代码会将 C 字符串 转换为类似 pascal 的字符串。请注意,作为类似 pascal 的字符串,没有 '\0'

#include <limits.h>
#include <stdlib.h>
#include <string.h>
char *pstring_convert(char *s) {
size_t len = strlen(s);
assert(len <= UCHAR_MAX);
memmove(s+1, s, len);
s[0] = (char) (unsigned char) len;
return s;
}

关于C 宏将字符串转换为 pascal 字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45961847/

25 4 0
文章推荐: c - 如何等待 pthread 条件变量或信号?
文章推荐: c# - 反射,将 List 转换为 IEnumerable