微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这是将一串字符数组复制到 C 中的二维数组的正确方法吗?

如何解决这是将一串字符数组复制到 C 中的二维数组的正确方法吗?

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

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

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

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

解决方法

立即将您的串行输入放入目标。如果您有多个 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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。