如何将指针传递给字符串,指针传递给子字符串并返回其他内容?

时间:2018-10-18 12:59:23

标签: c string pointers c-strings

我在一个空间非常有限的MCU上,以某种方式丢失了我在C语言中的引用。我想要这样的格式:

int commandsubstring(char *stringaddress,char *substringaddress);

但是,我在ASM中执行了此例程,因为我在C中遇到了一些问题,只是想完成它。既然完成了,我想修复它。该函数的作用是读取SCPI命令。我采用“ MEASure:VOLTage:DC?”的格式然后我递归地返回命令。在我的示例中,要返回子字符串的地址

 MEASure:VOLTage:DC?
 ^       ^ 

我希望能够做类似的事情:

char *cmd="MEASure:VOLTage:DC?";
char *subcmd;
commandsubstring(cmd, subcmd);
printf("%s\n", cmd);
printf("%s\n", subcmd);

然后得到

的结果
 MEASure:VOLTage:DC?
 VOLTage:DC?

我不确定为什么,但是我在过程中的某个地方丢失了指针。在其余的代码中,我只是返回结构,但是由于该特定部分是递归的,因此我想尝试一些我认为更安全的方法,但是我似乎无法正确地使用C语言,这只是个脑力劳动。某处。任何帮助将不胜感激。

修改 这不是关于标记化的问题,只是在相同字符串中正确返回不同位置的正确方法。

4 个答案:

答案 0 :(得分:2)

执行此操作时:

char *cmd="MEASure:VOLTage:DC?";
char *subcmd;
commandsubstring(cmd, subcmd);

您正在将subcmd传递给函数。在函数内部,它可能会为命名参数分配一个值,而该值不会更改调用函数中的变量。

处理此问题的最干净方法是删除第二个参数并返回有问题的指针,然后将其分配给subcmd

char *commandsubstring(char *stringaddress);

...

subcmd = commandsubstring(cmd);

答案 1 :(得分:2)

也许这个例子会有所帮助:

#include <stdio.h>

int commandsubstring(char *stringaddress,char **substringaddress)
{
    char * ptr = stringaddress;
    while (ptr!=0) {
        if ((*ptr)==':') { 
            *substringaddress = ptr+1; 
            break;
        }
        ptr++;
    }
    return 0;
}

int main()
{
    char *cmd="MEASure:VOLTage:DC?";
    char *subcmd;
    commandsubstring(cmd, &subcmd);
    printf("%s\n", cmd);
    printf("%s\n", subcmd);

    return 0;
}

答案 2 :(得分:1)

看看您提供的声明和用法示例,我想您需要一个指向指针的指针作为第二个参数。您拥有的是一个指向字符的指针。

您所拥有的东西看起来很像是未定义的行为:

/* Takes two pointer by value */
int commandsubstring(char *stringaddress,char *substringaddress);

void foo(void) 
{
   char *cmd="MEASure:VOLTage:DC?";
   char *subcmd;                  /* an uninitialized variable, could be anything */
   commandsubstring(cmd, subcmd); /* you pass an uninitilized variable in */
   printf("%s\n", cmd);
   printf("%s\n", subcmd);        /* you use an uninitialized variable. Nothing has changed it since it was declared. */
}

您对“正确返回同一字符串中不同位置的正确方法”的请求对我来说听起来像是“正确返回同一字符串中char的指针的方法”。有两种方法:您可以使用返回值,也可以使用OUT参数。

想象一下,不是char *,而是想从某个功能中获取int。这是您的“ int”选项:

/* You want (int) from you functions */
int use_int_return_value(void);
void use_int_out_parameter(int *pint_to_result);

/* You want (char *) from you functions */
char * use_pchar_return_value(void);
void use_pchar_out_parameter(char ** pchar_to_result);

答案 3 :(得分:1)

假设子命令由第一个:标识,您可以这样操作:

#include <stdio.h>
#include <string.h>

int main(void)
{
  const char * cmd = "MEASure:VOLTage:DC?";
  puts(cmd);
  const char * subcmd = strchr(cmd, ':');
  if (NULL == subcmd || !*(++subcmd))
  {
    fprintf(stderr, "No sub-command found.\n");
  }
  else
  {
    puts(subcmd);
  }
}

要将此功能用作功能

#include <stdio.h>
#include <string.h>
#include <assert.h>

const char * find_subcmd(const char * cmd)
{
  assert(NULL != cmd);

  char * subcmd = strchr(cmd, ':');
  return (NULL == subcmd || !*(++subcmd)) ?NULL :subcmd;
}

int main(void)
{
  const char * cmd = "MEASure:VOLTage:DC?";
  puts(cmd);
  const char * subcmd = find_subcmd(cmd);
  if (NULL == subcmd)
  {
    fprintf(stderr, "No sub-command found.\n");
  }
  else
  {
    puts(subcmd);
  }
}

#include <stdio.h>
#include <string.h>
#include <assert.h>

int find_subcmd(const char * cmd, char const ** psubcmd )
{
  assert(NULL != cmd);
  assert(NULL != psubcmd);

  char * subcmd = strchr(cmd, ':');
  *psubcmd = (NULL == subcmd || !*(++subcmd)) ?NULL :subcmd;

  return *psubcmd ?0 :-1;
}

int main(void)
{
  const char * cmd = "MEASure:VOLTage:DC?";
  const char * subcmd = NULL;
  puts(cmd);
  if (-1 == find_subcmd(cmd, &subcmd))
  {
    fprintf(stderr, "No sub-command found.\n");
  }
  else
  {
    puts(subcmd);
  }
}

请注意,在subcmd以上的任何解决方案中,都只是指向cmd所指向的内容。没有数据被复制。