C 函数的字符串数组

C 函数的字符串数组,c,arrays,pointers,stm32,C,Arrays,Pointers,Stm32,我正在尝试制作一个程序,在我的STM32 F091微控制器上使用板上的LED显示字母表的莫尔斯码(a-Z) 所以我用所有的可能性做了一个数组(K=Short,L=Long) 现在我的问题是,如果我在函数中使用这个指针,我只会得到数组中字符串的第一个字符。例如,我从“KL”中只得到“K” 如何获取完整的字符串?我知道可以使用%s打印出完整字符串,但如何将其传递给函数 我想要的是以下输出(显示在底部)。 然后用我的微控制器检查字符是否为“K”(短)比LED亮起的时间短,当字符为“L”(长)时,LED

我正在尝试制作一个程序,在我的STM32 F091微控制器上使用板上的LED显示字母表的莫尔斯码(a-Z)

所以我用所有的可能性做了一个数组(K=Short,L=Long)

现在我的问题是,如果我在函数中使用这个指针,我只会得到数组中字符串的第一个字符。例如,我从“KL”中只得到“K”

如何获取完整的字符串?我知道可以使用%s打印出完整字符串,但如何将其传递给函数

我想要的是以下输出(显示在底部)。 然后用我的微控制器检查字符是否为“K”(短)比LED亮起的时间短,当字符为“L”(长)时,LED亮起的时间长

A: KL 
B: LKKK 
C: LKLK 
D: LKK
E: K
F: KKLK
G: LLK
H: KKKK
I: KK
J: KLLL
K: LKL
L: KLKK
M: LL
N: LK
O: LLL
P: KLLK
Q: LLKL
R: KLK
S: KKK
T: L
U: KKL
V: KKKL
W: KLL
X: LKKL
Y: LKLL
Z: LLKK
范例

int main(void)
{
     while (1)
      {
      /* USER CODE END WHILE */

      /* USER CODE BEGIN 3 */
        for(char alphabet = 'A'; alphabet <= 'Z';alphabet++)
        {
            Morsecode(alphabet);
            CharToLeds(*Morse[i]);
            i++;
        }
}

void Morsecode(char ch)
{
        if(j == 26)
        {
            j = 0;
        }
        printf("\r\n %c: %s", ch ,Morse[j]);
        HAL_Delay(1000);
        j++;
}
void CharToLeds(char data)
{
    if(data == 'K')
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
        HAL_Delay(1000);
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
    }
    if (data == 'L')
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
        HAL_Delay(3000);
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
    }
}   
int main(无效)
{
而(1)
{
/*用户代码结束时*/
/*用户代码开始3*/

对于(char-alphabet='A';alphabet,此答案仅限于显示如何传递莫尔斯字符串,然后处理每个莫尔斯分量,即Ks和Ls.:

通过最近的后期编辑,很明显您需要对函数原型和数组索引进行调整:(请参阅图表以了解数组索引修改的说明)

char*Morse[26]={“KL”、“LKKK”、“LKLK”、“LKK”、“K”,
“KKLK”、“LLK”、“KKK”、“KK”、“KLL”,
“LKL”、“KLKK”、“LL”、“LK”、“LLL”,
“KLLK”、“LLKL”、“KLK”、“KKK”、“L”,
“KKL”、“KKKL”、“KLL”、“LKKL”、“LKLL”、“LLKK”};
void chartoles(char*data);//将原型更改为char*,以允许传递
//26根莫尔斯弦中的一根
int main()
{
//从0到26索引字母表,以匹配莫尔斯字符串数组的索引
//字符字母表;
//for(alphabet=0;alphabet<'Z'-'A';alphabet++)//另一个选项(用于可读性)

对于(char-alphabet='A'-65;alphabet来说,这非常简单:

void foo(char** morse, int size)
{
    for (int i = 0; i < size; ++i)
         printf("%s\n", morse[i]);
}

int main()
{
   const char *Morse[26] = ...;
   foo(Morse, 26);
}
void foo(字符**morse,整数大小)
{
对于(int i=0;i

作为旁注,请注意字符串文字是不可变的,因此请使用
const char*
而不是
char*

将函数参数用作指向数组(*[])或双指针(**)的指针


也许编译器需要一些强制转换来避免警告。

在c语言中,不能传递数组,只能传递指向字符串第一个字符的指针。(字符串是字符数组)

因此,您的函数应该如下所示:

void function(char * morseString[], int size){
   printf("%s\n",morseString[0]); // <--- will print "KL"

}

假设要将数组传递到的函数是

void Func (char * x)
{

}
您可以将此函数称为

Func(Morse[0]) // will pass Morse[0] = KL
print(Morse[5]);


当您获得指向字符串中第一个字符的指针时,您的任务是递增指针,并从指针指向的位置读取数据,直到该数据等于0(表示字符串结束)

char *arr[] = {"ABC", "CDE"};

char *ptr = arr[0]; //ptr now points to first character of "ABC" string

do {
    putchar(*ptr); //pass character under pointer to your function
} while(*(++ptr) != 0); //do it while the character isn't equal 0
现在我的问题是,如果我在函数中使用这个指针,我只能得到数组中字符串的第一个字符。例如,我只能从“KL”中得到“K”

这很简单。当您拥有指向字符的
指针数组时(
Morse
),要处理特定字符数组并访问其字符,您可以使用指向字符的
指针。下面的代码会让您理解

char *cstr;
char *Morse[26] = {"KL", "LKKK", "LKLK", "LKK", "K", "KKLK", "LLK", "KKKK", "KK", "KLLL", "LKL", "KLKK", "LL", "LK", "LLL", "KLLK", "LLKL", "KLK", "KKK", "L", "KKL", "KKKL", "KLL", "LKKL", "LKLL", "LLKK"};

cstr=Morse[1]; // c points to character array "LKKK"
printf("%s", cstr); // it prints character array "LKKK"
printf("%c", cstr[1]); // it prints character 'K'
您可以使用下标运算符
[]
访问cstr所指向的字符数组的字符

如果要将特定字符数组从
Morse
传递给函数,可以如下声明和定义函数:

void print(char *cstr);

void print(char *cstr)
{
    //Do something here.
    printf("%s\n", cstr);
}
您可以调用上面的函数作为

Func(Morse[0]) // will pass Morse[0] = KL
print(Morse[5]);

显示仅打印出
K
的代码。可能重复的注意事项:您应该限定数组(分别为元素)及其指向的
const
以使数据在闪存中。否则,数组至少在宝贵的RAM中。显示您的代码-请阅读如何创建MCVE()。我们无法猜测您选择了哪种方式来编写错误的代码;有很多可能性,我们必须看看您选择了哪种方式来帮助您修复错误。所有现有的答案都必须猜测您在做什么,然后修复他们对您在做什么的解释。他们中的许多人可能会完成这项工作b你需要,但你应该向我们展示你在做什么,这样我们才能真正帮助你,而不是简单地为你编写代码。@Ryker我确实感兴趣,我只是对C有点陌生。请尽力理解。在编辑框上方(你输入答案的地方,有编辑工具。对于代码片段,请选择代码文本并单击
{}
symbol.Ok brother and Thank@Ryker.Should:
printf(“%s\n”,morseString[num_elem]);
?num_elem是大小…0只是为了测试它是否有效。@Ryker也许,现在更清楚了,当你不解释原因就投否决票时,这不是建设性的,我不是反对票,我只是建议更改硬编码的
[0]
[num_elem]
。我也同意没有评论的否决票是没有建设性的。谢谢你的建议。我已经编辑了我的答案。谢谢你!现在可以了。我不知道你可以这样将字符串拆分为字符。@stickfigure4-欢迎你。你能给你的代码添加一些上下文吗?
char *cstr;
char *Morse[26] = {"KL", "LKKK", "LKLK", "LKK", "K", "KKLK", "LLK", "KKKK", "KK", "KLLL", "LKL", "KLKK", "LL", "LK", "LLL", "KLLK", "LLKL", "KLK", "KKK", "L", "KKL", "KKKL", "KLL", "LKKL", "LKLL", "LLKK"};

cstr=Morse[1]; // c points to character array "LKKK"
printf("%s", cstr); // it prints character array "LKKK"
printf("%c", cstr[1]); // it prints character 'K'
void print(char *cstr);

void print(char *cstr)
{
    //Do something here.
    printf("%s\n", cstr);
}
print(Morse[5]);