需要帮助在C中操作字符串/指针

时间:2014-04-11 21:18:06

标签: c string pointers concatenation

基本上我有类似的东西(这是一个工作顺序):

    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但是我的代码崩溃了,因为我认为它是因为命令只是一个指针。

任何帮助都将不胜感激。

4 个答案:

答案 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。