Как мне очистить массив

#c #arduino

#c #arduino

Вопрос:

Я пытаюсь написать программу, которая может считывать строку из ввода последовательного монитора и подсчитывать размер символов в качестве входных данных и сохранять входные данные в массив, но у меня есть некоторые проблемы с тем, что последовательный монитор останется последними входными данными, например, если я введу ABC, он покажет «Размервходных данных = 3 символа» затем я снова ввожу ABC, останутся последние данные, которые я ввел ранее, я уже сбросил их = 0 какую ошибку я совершаю?

Последовательный монитор показывает:

Пожалуйста, введите

Размер входных данных = 3 символа

ABC

Пожалуйста, введите

Пожалуйста, введите

Размер входных данных = 7 символов

ABC

ABC

вот мой код:

 String Msg  ; 
char buf[1200]={0} ;     // this is an array
char input;
int num=0;
void setup() {
  // Initialize serial and wait for port to open:  
  Serial.begin(115200);
  while (!Serial) 
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }
   }
 
 void loop() {
  while (Serial.available()) 
  {
    input = (char)Serial.read();
     if(input != 'n' ) 
    { 
      buf[num] = input;  
      Msg =input;    
      num  ;
     }
     else{
      buf[num  ] = input;  // last character is newline
      buf[num] = 0;         // string array should be terminated with a zero
      Serial.println("Please input");
      Serial.print("Size of input data =  ");
      Serial.print(Msg.length());
      Serial.print(" characters");
      Serial.println("");
      Serial.println(Msg);
      Serial.println("Please input");
      Serial.println("");
      Serial.println("");
        for(int i=0; i<num ;i  ){
        Msg[i]=0;
        buf[i] =0;
        }
        
       
       }
       num=0;
       }
    return;
         }
 

Комментарии:

1. извините, я должен исправить размер входных данных = 6 символов, а не 7 символов

2. ваша проблема не в том, что вы не можете очистить массив. вам не удается очистить строку. По крайней мере, это то, что вы печатаете содержимое и размер. массив не используется в вашем выводе

Ответ №1:

Согласно руководству Arduino, строковый [] оператор выполняет то же charAt() самое, что и . Поскольку есть также setCharAt() функция, я полагаю [] , и charAt() доступна только для чтения.

В руководстве этого не сказано, но зачем им setCharAt() тогда.

Просто назначьте пустую строку Msg , чтобы очистить ее.

 Msg = "";
 

Ответ №2:

Вы делаете это неправильно.

Msg — это переменная строкового типа, а не массив, поэтому вы можете просто очистить строку, как показано ниже.

 Msg="";
 

Не используйте ненужный цикл for для очистки массива буфера символов, вы можете сделать это лучше, используя функцию memset .

 memset(buf, 0, sizeof(buf));
 

и, наконец, возьмите «num = 0;» внутри цикла else, чтобы он был равен нулю после завершения, а не каждый раз, когда выполняется цикл.

Итак, окончательный протестированный код будет выглядеть следующим образом,

 String Msg  ;
char buf[1200] = {0} ;   // this is an array
char input;
int num = 0;
void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial)
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}
void loop() {
  while (Serial.available())
  {
    input = (char)Serial.read();
    if (input != 'n' )
    {
      buf[num] = input;
      Msg  = input;
      num  ;
    }
    else {
      buf[num  ] = input;  // last character is newline
      buf[num] = 0;         // string array should be terminated with a zero
      Serial.println("Please input");
      Serial.print("Size of input data =  ");
      Serial.print(Msg.length());
      Serial.print(" characters");
      Serial.println("");
      Serial.println(Msg);
      Serial.println("Please input");
      Serial.println("");
      Serial.println("");
      Msg ="";
      memset(buf, 0, sizeof(buf));
      num = 0;
    }
    
  }
  return;
}