首页 > 解决方案 > 这是在C中将一串char数组复制到二维数组的正确方法吗?

问题描述

我目前正在使用 C 语言对 Arduino Uno 进行编程,并且正在编写一个操作字符串对象的程序。据我所知,由于内存问题,使用 String 对象对于微控制器来说并不是很好的内存,因此,我尝试使用 char 数组来代替,并且只有字符串用于串行输入。

我想问一下,这是将 char 数组(本质上是字符串)复制到多个字符串的二维数组的好方法吗?

char validID[][12] = {"XX XX XX XX"};       

String word;
char data[12];
Serial.println("Enter word: ");
if(Serial.available() > 0){
    word = Serial.readString();
}
word.toCharArray(data, 12); //converts String to char array
strcpy(validID[1],data); //trying to store a new string to index 1 of validID array

最初我选择只创建一个函数并将每个字节复制到另一个数组,尽管我认为预定义的函数可能会在我的草图中节省内存。我应该改用那种方法吗?

标签: c++arraysstringarduinochar

解决方案


将您的串行输入立即放入目标中。如果您有多个 ID(所有相同的文本长度)并且想要避免动态内存,则应事先定义最大元素数量。

typedef char IDText[12]; 

IDText validID[4]; // four texts, (11+1)char each

bool getID(IDText& id) {
  // returns true if input is valid
  if (Serial.available() >0) {
    byte idx=0;
    while (-1 != (id[idx] = Serial.read()) ) {
      if (idx < sizeof(IDText)-1) idx++; 
      delay(2); // wait for next char @9600 
    }
    id[idx] = 0; 
    return true; // demo: no other checks here
  }
  return false; // no input available
}

//include Streaming out
template<class T> inline Print& operator<< (Print &obj, T arg) { obj.print(arg); return obj; }
const char endl {'\n'};

void setup() {
  Serial.begin(9600);
  Serial << F("Start: ") << __FILE__ << endl; 
}

void loop() {
  static byte idNr = 0;
  if (idNr < 4)
    if ( getID(validID[idNr]) ) {
      idNr++;
      Serial << "Got " << idNr << " validIDs now: " << endl;
      for (byte i = 0; i < idNr; i++) Serial << "  " << validID[i] << endl;
      Serial << " ------------- " << endl;
    }
}

推荐阅读