基本上我有类似的东西(这是一个工作顺序):
char *command; // pointer to transmit buffer
command = "RST; ISET 0.10A; VSET 0.00V; OUT OFF\r";
transmit_command(PORT, command, 0);
在概念上,我希望能够灵活地以下列方式更新命令:
float = current_setting;
float = voltage_setting;
command = "RST; ISET " + current_setting + "A; VSET " + voltage_setting + "V; OUT OFF\r":
transmit_command(PORT, command, 0);
我对操纵C中的指针并不是很了解,所以我的实验没有运气。我尝试了strcpy,strcat和sprintf但是我的代码崩溃了,因为我认为它是因为命令只是一个指针。
任何帮助都将不胜感激。
答案 0 :(得分:2)
在C中,字符串实际上是以\0
字符结尾的字符数组。所以基本上,字符串操作很糟糕,因为你不能简单地将字符串添加到一起。
正如您所猜测的那样,您的一个问题是您没有声明一个数组来放置您的角色。你的第一个例子是有效的,因为指针指向用于将常量保持在内存中的字符数组。
首先,您声明了一个包含字符串的数组。如果你不是很困难,你可以简单地用char command[100];
之类的东西来解决问题。
然后,在您的情况下,您可以使用sprintf
功能。它的工作方式与printf
类似,但它将结果放在字符数组(字符串)中。
这样的事情应该有效:
float current_setting = [whatever];
float voltage_setting = [whatever];
char command[100];
sprintf(command, "RST; ISET; %fA; VSET %fV;OUT OFF\r", current_setting, voltage_setting);
command = "RST; ISET " + current_setting + "A; VSET " + voltage_setting + "V; OUT OFF\r":
transmit_command(PORT, command, 0);
警告:让确定为字符串声明一个足够大的数组。不声明(或分配,如果你动态地执行)足够大的内存区域可能会导致损坏,崩溃和漏洞,因为字符串函数(如sprintf
)从不检查数组是否足够大(事实上,他们不能!)
答案 1 :(得分:1)
在许多* nix系统上,您可以使用asprintf(),它使用malloc分配自己的内存来存储生成的字符串。 (完成后,你应该释放()字符串,以免造成内存泄漏):
...
char *command = NULL;
float = current_setting;
float = voltage_setting;
asprintf(&command, "RST; ISET %fA; VSET %fV; OUT OFF\r ",
current_setting,
voltage_setting
);
transmit_command(PORT, command, 0);
if(command)
free(command);
...
答案 2 :(得分:0)
我之前的一个更便携的答案...(如果你没有asprintf(),这是一个很好的替代品。)
...
char *command = NULL;
size_t commandLength;
float = current_setting;
float = voltage_setting;
commandLength = snprintf(NULL, 0, "RST; ISET %fA; VSET %fV; OUT OFF\r ",
current_setting,
voltage_setting
);
command=malloc(commandLength + 1);
snprintf(&command, commandLength + 1, "RST; ISET %fA; VSET %fV; OUT OFF\r ",
current_setting,
voltage_setting
);
transmit_command(PORT, command, 0);
if(command)
free(command);
...
答案 3 :(得分:-1)
将'char * command'改为'char命令[38]'。然后你可以使用strcpy(命令,“RST; ISET 0.10A; VSET 0.00V; OUT OFF \ r”);当然,假设您知道您的字符串不会超过37个字符(加上空终止符)请务必在文件顶部添加#include。