gpt4 book ai didi

c - 如何提高代码的可读性?

转载 作者:行者123 更新时间:2023-12-02 00:16:19 25 4
gpt4 key购买 nike

我知道函数send()通过winsocket的有效负载是一个指向char数组的指针,我想用它来发送一组固定值,我想写这样的东西

send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE), 0);

同时,以这种方式或类似方式(将其视为伪代码)设置对(名称,值)的可读性和维护性会很舒服:

FIXED_VALUE_1 <- 1
FIXED_VALUE_2 <- 2
FIXED_VALUE_3 <- 3
...

我可以用来做什么?我已经丢弃了枚举,因为它们是整数,并且我认为发送四次发送,每次发送一个字节是一种浪费。另一种方法是定义一个宏,但我不能为一个字节而不仅仅是一个字符串定义一个宏,因为我想发送“27”,而不是“2”、“7”。

提前致谢。

最佳答案

首先,请注意,如所写,

send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE_N), 0);  
^^ //added to correct typo

FIXED_VALUE_N 必须采用 const char * 的形式才正确。并且,strnlen() 需要两个参数(第二个是 size_t number_of_elements)。

编辑 3(解决最新评论问题)

如果您将 FIXED_VALUE_N 声明并填充为:

const char FIXED_VALUE_N[2];
FIXED_VALUE_N[0]=0x1B;

以及更正第三个参数的语法...

send(socket, FIXED_VALUE_N, 1, 0); //hard-coded third argument for illustration  

...它会起作用,因为您现在在第二个参数中传递指向 const char (const char *) 的指针,并遵守 send()< 的语法要求 原型(prototype)。
(编辑 3 结束)

考虑到这一点,您是否考虑过将数据字符串连接成逗号分隔的组?这将允许发送多个值,并在接收端进行解析。例如:

#define MAX_SIZE 100 //pick a value that makes sense for your application, I randomly picked 100
char buffer[MAX_SIZE];
int len=0;

sprintf(buffer, "%d,%d,%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
len = strlen(buffer); //****
send(socket, buffer, len + 1, 0); // strlen() does not include `\0` byte in its return
// value. Use `len +1` to make room for
// \0 terminator - added by the sprintf() function.

将发送“1,2,3”

关于您的声明:因为我想发送“27”,而不是“2”、“7”。

在格式化 sprintf() 语句中省略逗号,您发送的数字将是连续的。

sprintf(buffer, "%d%d%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
^^^^^^

将发送“123”

编辑(使用 sprintf 的返回填充 len)
另外,正如@Jack 所指出的:
您可以通过简单地设置 len = sprintf(...); 来节省一行代码,而不是使用 strlen()在上面的线上。 (参见上面代码片段中的****)sprintf() 返回传输的字符数,如果发生输出错误,则返回负值。(如果输出为负,则发生错误)

编辑2(字节数据,根据您上面的评论)

如果您想以最小(最有效)的形式发送数据,请使用字节数据。字节数据可以存储在字符数组中:

char *byte_data=0;

byte_data = malloc(NUM_BYTES_RQD);//#define NUM_BYTES_RQD as needed,
//or pass in size info as an argument
//from calling function

//populate byte_data

for(i=0;<NUM_BYTES_RQD;i++)
{
byte_data[i]=<enter byte value here>
}
send(socket, byte_data, len, 0);
free(byte_data);

关于c - 如何提高代码的可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512389/

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