Как получить длину массива, заполненного вводом - PullRequest
0 голосов
/ 11 апреля 2020

Я задал вопрос здесь , и теперь приведенный ниже код выполняет работу, которую я ожидал (работу, о которой я упоминал ранее). Теперь у меня есть другая проблема: если я пишу tmp[20] и если размер ввода составляет 20 символов, код работает. Однако размер ввода не известен. Следовательно, может быть максимальный размер, но фактический размер зависит от ввода. Как я могу заставить этот код работать с любой длиной? (да, код работает, когда я пишу 200 внутри tmp, но размер 'сообщения' зависит от всего массива. Это должно быть 3 символа до конца и 6 символов после запуска). Поэтому, когда я пишу 200 внутри tmp[] и ввод короче 200 символов, сообщение возвращается неверно. Я думаю, что я должен использовать динамическое выделение памяти c, но я не смог реализовать его в своем коде.

Вот мой полный код:

char tmp[20] = { 0 };
int len = sizeof(tmp) / sizeof(tmp[0]);
String pack;
String command;
String Size;
String messum;
String message;
String checksum;

int Index = 0;
bool Seen = false;

void setup() {
    Serial.begin(9600);
}

void loop() {  
    while (Serial.available() > 0) {
        char received = Serial.read();

        if (received == '!') {
            Seen = true;
        } else
        if (received == '#') {
            return strdup(tmp);
        } else
        if (Seen == true) { 
            if (Index < 2) {
                //Serial.print("P");
                pack = tmp[Index++] = received;
                Serial.print(pack);
            } else
            if (Index < 4) {
                //Serial.print("C");
                command = tmp[Index++] = received;
                Serial.print(command);
            } else
            if (Index < 6) {
                //Serial.print("S");
                Size = tmp[Index++] = received;
                Serial.print(Size);
            } else
            if (Index < (len - 3)) {
                //Serial.print("M");
                message = tmp[Index++] = received;
                Serial.print(message);
            } else
            if (Index < len) {
                //Serial.print("C");
                checksum = tmp[Index++] = received;
                Serial.print(checksum);
            }  
        }
    }
    return NULL;
    //input:  asdeyh134!123456789abcdefghtry#8647dfn
}

1 Ответ

0 голосов
/ 11 апреля 2020

Везде, где вы добавляете символы в свой массив, например:

if (Seen == true) { 
            if (Index < 2) {
                //Serial.print("P");
                pack = tmp[Index++] = received;
                Serial.print(pack);

Вы также должны завершать строку нулем следующим образом:

if (Seen == true) { 
            if (Index < 2) {
                //Serial.print("P");
                pack = tmp[Index++] = received;
                tmp[Index] = 0;
                Serial.print(pack);

Таким образом, вы можете использовать strlen для получения длина строки в массиве. Он будет считать количество символов до этого нулевого символа.

int length = strlen(tmp);

На следующем проходе l oop, когда вы пишете другим символом, вы запишите его поверх этого нуля, а затем запишите новый ноль сразу после этого нового символа.

...