Кто-нибудь может привести пример извлечения данных из массива char?
- Я перепробовал так много вещей, что теперь я просто запутался.
- Я не понимаю, как работают массивы символов.
- Я не могу извлечь дату и имена. И когда я использую только строки, я замыкаю память.
Ниже была моя последняя попытка, прежде чем задать вопрос.
while (f.available()) {
String line = f.readStringUntil('\n');
if (line.startsWith("04-23")) {
currentDay = 1;
int str_len = line.length() + 1;
char char_array[str_len];
line.toCharArray(char_array, str_len);
Serial.println(char_array); // Все работает здесь
for (int j = 0; j < 2; j++) {
b += char_array[j];
}
bMth = b.toInt (); // В данном случае это должно быть int месяца рождения: 04
}
}
Var:
format: MM-DD-YYYY,Name // this is inside the file
line = "04-23-2020,James" // This is the output from - Serial.println(char_array);
То, что я пытаюсь сделать, это
- Извлеките месяц/день, чтобы я мог сравнить его с сегодняшним днем.
- Год, чтобы я мог вычислить возраст.
- Имя для отображения на OLED-дисплее.
- Все остальное, кажется, работает, но я не могу сосредоточиться на доступе к массиву символов.
Чтобы сделать это в PowerShell, я бы сделал следующее:
$line = "04-23-2020,James"
$dob = ($line.Split(","))[0]
$bMth = ($dob.Split("-"))[0] # This is not used in this example
$bDy = ($dob.Split("-"))[1] # This is not used in this example
$bYr = ($dob.Split("-"))[2]
$age = $(get-date -UFormat %Y) - $bYr
Clear-Host
Write-Host (@'
Name: {0}
Age: {1}
'@ -f $($line.Split(","))[1], $age)
В Python:
import datetime as dt
line = "04-23-2020,James"
dob = (line.split(',')[0])
bMth = (dob.split("-"))[0] # This is not used in this example
bDy = (dob.split("-"))[1] # This is not used in this example
bYr = (dob.split("-"))[2]
age = int(dt.datetime.now().year) - int(bYr)
print('Name: ',(line.split(',')[1]))
print('Age: ', age)
@E_Ja, 👍1
Обсуждение2 ответа
▲ 0
Вы можете попробовать sscanf, если ваш формат данных фиксирован, что-то вроде этого:
char line[] = "04-23-2020,James";
int day, month, year;
char name[100];
if (sscanf(line, "%d-%d-%d,%s", &month, &day, &year, name) == 4)
{
// Обработайте эти четыре пункта.
}
,
@tim
но код для scanf занимает 1,5 кБ флэш-памяти, @Juraj
▲ 1
При работе с Arduino, cplusplus.com это твой друг. Прокрутите вниз и посмотрите на левую сторону под (string.h). Там много замечательных
функций. Другие полезные функции, такие как iota()
- cplusplus.com...
Вот один из способов выполнить разбор входных данных.
// Sketch uses 2064 bytes (6%) of program storage space.
// Global variables use 323 bytes (15%) of dynamic memory.
// Arduino IDE 1.8.9.
char line[] = "04-23-2020,James";
char Name[100];
unsigned int Month, Day, Year;
// Make an attempt to validate the input data.
byte Counter = 0;
void setup(){
Serial.begin(9600);
char * pch = strtok(line, "-,");
while(pch != NULL){
if(Counter == 0){Month = atoi(pch);}
else if(Counter == 1){Day = atoi(pch);}
else if(Counter == 2){Year = atoi(pch);}
else if(Counter == 3){strcpy(Name, pch);}
pch = strtok(NULL, "-,");
Counter += 1;
}
// Print out the data.
if(Counter == 4){
Serial.println(Month);
Serial.println(Day);
Serial.println(Year);
Serial.println(Name);
}
else{
Serial.println("Error");
}
}
void loop(){}
,
@VE7JRO
Смотрите также:
- Замена нескольких выводов pinMode() и digitalWrite() на массив
- Работает ли конструкция int array[100] = {0} на Arduino?
- Массив динамического размера в качестве члена класса
- Итерация массива объектов
- Как получить размер (sizeof) массива структур
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Безопасно ли использовать std::array (из C++ STL) на Arduino? Использует ли он динамическое выделение памяти?
- Есть ли ограничения на размер массива в Arduino Mega 2560?
Помогает ли это? https://majenko.co.uk/blog/splitting-text-c, @Majenko
Я рекомендую научиться использовать функцию " strtok ()". Это также описано в записи блога Мадженко, @chrisl