簡體   English   中英

如何將指針傳遞給字符串,指針傳遞給子字符串並返回其他內容?

[英]How to pass the pointer to a string, pointer to a substring, and return something else?

我使用的是空間極為有限的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語言,這只是個腦力勞動。某處。 任何幫助將不勝感激。

編輯這不是關於標記化的問題,只是正確地在同一字符串中返回不同位置的正確方法。

執行此操作時:

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

您正在將subcmd subcmd給該函數。 在函數內部,它可能會為命名參數分配一個值,該值不會更改調用函數中的變量。

解決此問題的最干凈方法是刪除第二個參數並返回有問題的指針,並將其分配給subcmd

char *commandsubstring(char *stringaddress);

...

subcmd = commandsubstring(cmd);

也許這個例子會有所幫助:

#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;
}

看一下您提供的聲明和用法示例,我想您需要一個指向指針的指針作為第二個參數。 您擁有的是一個指向字符的指針。

您所擁有的看起來很像是一種不確定的行為:

/* 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);

假設子命令由1st標識:您可以這樣進行操作:

#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指向的內容“指向”。 沒有數據被復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM