Обновление строки в C - PullRequest
       28

Обновление строки в C

0 голосов
/ 17 ноября 2018

У меня есть функция на маленьком микроэлементе, который отправляет один символ за раз из порта 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 для компиляции, но это, должно быть, утечка памяти, потому что когда я ее запускал, все порты ввода / вывода на чипе становились неработоспособными.

strcpy(source,"Different String");

Я хочу что-то сделатьвот так, затем снова вызовите мою первую функцию и напечатайте новую обновленную строку из последовательного порта.

Я понимаю концепцию указателей, но все, что я читаю, объяснение синтаксиса я не могу понять.Я перепробовал кучу разных комбинаций, ставя старты до и после всего.Неважно, что это полный провал.

Я перечитал это замечательное объяснение, однако, как и большинство объяснений, эта штука останавливается ТОЛЬКО КРАТКОЕ, фактически предоставляя единственную строку кода, которая фактически заставляет все это работать навнизу, когда речь идет о динамическом обновлении строки: https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

Спасибо.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

(я отредактировал свой пост и добавил это, так как вы можете 't добавить новый пост ниже, не «отвечая» на свой вопрос, а раздел ответа на комментарий не допускает форматирования и ограничен 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

Теперь, вероятно, есть способ сделать это, требующий степени магистра.Я просто пытаюсь заставить это глупое меню работать.Я буквально создаю отдельные функции, которые создают новый массив символов для каждой строки, что является неправильным способом сделать это, но это единственное, что я могу понять после нескольких часов борьбы с этим.

Ответы [ 4 ]

0 голосов
/ 17 ноября 2018

Спасибо за помощь всем, но у меня нет времени. Победил на этом. Я занимался этим некоторое время - я написал низкоуровневые драйверы и радиосистемы и т. Д., Но мне никогда не приходилось иметь дело с текстом. Это то, чему они учат в первый день написания кода на 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]);
    }

}
0 голосов
/ 17 ноября 2018

Исходя из вашего последнего комментария, кажется, что вам нужно хранить содержимое меню в виде массива строк. В 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]);
}
0 голосов
/ 17 ноября 2018

Это НЕ "ответ", но это единственный способ, которым я могу обмануть stackoverflow, позволив мне отправить почтовый код.

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();
}

^^^ попробовал это, не скомпилируется.

0 голосов
/ 17 ноября 2018

Предположим, что вы написали буквально то, что вы пытались ....

source[] - это 10-байтовый массив.

"Different String" имеет длину 17 байт.

Вы переполнили source[] и забили, кто знает, что.

...