在 C 中更新字符串

Updating string in C

我在小型微型计算机上有一个功能,可以一次从 UART 端口发送一个字符。

USART_0_write('x');

这会导致一个字符x出串口。

我创建了这个有效的函数:

char source[] = "Test Text.";
for (uint8_t i=0; i < strlen(source); i++){
    USART_0_write(source[i]);
}

我只想动态更新我发送的字符串,而不是为我发送的每个内容创建不同的数组。

我基本上想做我假设 strcpy 所做的事情,但我无法使该功能正常工作。我得到了一个使用 strcpy 编译一次的版本,但它一定是内存泄漏,因为当我 运行 它时,芯片上的所有 I/O 端口都变了。

strcpy(source,"Different String");

我想做这样的事情然后再次调用我的第一个函数并让它从串行端口打印新的更新字符串。

我理解指针的概念,但是我看语法解释的一切我都看不懂。我尝试了很多不同的组合,将开始放在一切之前和之后。不管怎样都是失败。

我仔细阅读了这个很好的解释,但是,就像那里的大多数解释一样,当它谈论动态更新字符串时,实际上只提供了一行代码,它实际上使它在底部工作: https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

谢谢。

附加信息:

(我编辑了我的 post 并添加了这个,因为如果没有 "answering" 你自己的问题,你不能在下面添加新的 post,并且评论回复部分没有允许任何格式并限制为 500 个字符,这是愚蠢的)。

我正在尝试通过执行以下操作来创建菜单:

my_string = "Menu item 1";
sendString(my_string); //function to iterate through characters sending them
my_string = "Menu item 2";
sendString(my_string); //function to iterate through characters sending them
my_string = "Menu item 3";
sendString(my_string); //function to iterate through characters sending them

现在可能有一种方法可以做到这一点,需要硕士学位。我只是想让这个愚蠢的菜单起作用。我实际上是在创建单独的函数,为每一行创建一个新的字符数组,这是错误的方法,但这是我在与它战斗数小时后唯一能弄清楚的。

假定您所写的正是您所尝试的....

source[] 是一个 10 字节的数组。

"Different String" 是 17 个字节长。

你溢出 source[] 并破坏了谁知道什么。

根据您最后的评论,您似乎需要将菜单的内容存储在一个字符串数组中。在 C 中,这将是 char **,例如char **menu;.

如果您的菜单中有 3 个项目,那么您可以像这样为菜单分配内存:char **menu = (char **)malloc(3 * sizeof(char *));

然后您需要填写菜单中的项目,例如:

menu[0] = (char *)malloc(64 * sizeof(char)); // 64 as an example
menu[1] = (char *)malloc(64 * sizeof(char));
...
strcpy(menu[0], "Item 1");
strcpy(menu[1], "Item 2");
...

等等。 然后您可以遍历菜单中的三个项目,并将每个项目发送到您的函数。

for(int i = 0; i < 3; i++) {
    sendString(menu[i]);
}

这不是 "answer",但这是我可以欺骗 Whosebug 让我 post 代码的唯一方法。

void makeMenu(void){
    char **menu = (char **)malloc(3 * sizeof(char *));

    menu[0] = (char *)malloc(64 * sizeof(char)); // 64 as an example
    menu[1] = (char *)malloc(64 * sizeof(char));
    menu[2] = (char *)malloc(64 * sizeof(char));

    strcpy(menu[0], "Welcome to the menu. Make selection:");
    strcpy(menu[1], "1: Turn on light");
    strcpy(menu[1], "2: Turn off light");

}

void sendMenu(**menu){
    for (uint8_t i=0; i < 3; i++){
        sendSingleLine(menu[i]);
    }
}

void sendSingleLine(*string_to_send){
    for (uint8_t i=0; i < strlen(string_to_send); i++){
        USART_0_write(string_to_send[i]);
    }
}

int main(void){
makeMenu();
    sendMenu();
}

^^^ 试过了,无法编译。

感谢大家的帮助,但我没时间了。这一败。我从事此工作已有一段时间了——我编写过低级驱动程序和无线电系统等,但从来不需要处理文本。这是他们在第一天 Python 编码时教的东西。哈哈

以下是我的解决方法。丑陋但有效。我只是调用 uart_menu() 并打印出来。完毕。如果我能弄清楚如何将我的数组发送到函数而不必每次都重新编写它,那将会很有帮助。

void uart_menu(void){
    char line1[] = "Test Menu:\n";
    for (uint8_t i=0; i < strlen(line1); i++){
        USART_0_write(line1[i]);
    }

    char line2[] = "1: Turn on 0xA2\n";
    for (uint8_t i=0; i < strlen(line2); i++){
        USART_0_write(line2[i]);
    }

    char line3[] = "2: Turn off 0xA2\n";
    for (uint8_t i=0; i < strlen(line3); i++){
        USART_0_write(line3[i]);
    }

    char line4[] = "3: Turn on All Addresses\n";
    for (uint8_t i=0; i < strlen(line4); i++){
        USART_0_write(line4[i]);
    }

    char line5[] = "4: Turn off All Addresses\n";
    for (uint8_t i=0; i < strlen(line5); i++){
        USART_0_write(line5[i]);
    }

}