[英]Return pointer of start of substring in string with restrictions (C)
[英]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.