c++ - 这是在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
最初我选择只创建一个函数并将每个字节复制到另一个数组,尽管我认为预定义的函数可能会在我的草图中节省内存。我应该改用那种方法吗?
解决方案
将您的串行输入立即放入目标中。如果您有多个 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;
}
}
推荐阅读
- java - 使用 GSON 在 Volley 中发送参数
- swift - 如何在 Controller 中使用两个按钮?每个按钮都有一个tableview?
- flutter - 如何在 Flutter 中重新加载 webview?
- vue.js - 升级vue后出现白屏死机,[HMR] Waiting for update signal from WDS
- azure - 使用 pyspark 从 Jupyter notebook 连接 SQL DW
- c++ - 如何在 C++ 中迭代非常量变量?
- c# - 我正在尝试在 pdf 中插入指向另一个网站的超链接
- javascript - 在html页面中读取Json“元素”
- r - 函数不使用 read.csv2 读取 CSV 文件
- arrays - 如何使用 Nativescript 索引数组内的数组