strtok сохранить исходный символ
Я хочу сделать словарную программу для Arduino. Словари сохраняются в массиве символов, разделенном символом «/». Теперь я хочу разделить случайно выбранный символ и разделить его по символу «/», чтобы сохранить его в двух переменных. Но если я сделаю это с помощью strtok, исходная строка будет принесена в жертву. Если сейчас повторится та же самая фраза...
Надеюсь, вы сможете мне помочь, но если вы считаете, что лучше поступить иначе, я открыт для предложений. Вот мой код
long random1, random2, random3, random4;
int lengtharray = 5;
char* vocab1;
char* vocab2;
char* vocab3;
char* vocab4;
char* german1;
char* english1;
char vocabs[5][16] = {"Apfel/apple","er/he","Zoo/zoo","sie/she","Hallo/hello"};
void setup() {
Serial.begin(9600); //Отладка
}
void loop() {
randomSeed(analogRead(0));
random1 = random(0,lengtharray);
randomSeed(analogRead(0));
random2 = random(0,lengtharray);
while(random2 == random1){
randomSeed(analogRead(0));
random2 = random(0,lengtharray);
}
randomSeed(analogRead(0));
random3 = random(0,lengtharray);
while(random3 == random1 || random3 == random2){
randomSeed(analogRead(0));
random3 = random(0,lengtharray);
}
randomSeed(analogRead(0));
random4 = random(0,lengtharray);
while(random4 == random1 || random4 == random2 || random4 == random3){
randomSeed(analogRead(0));
random4 = random(0,lengtharray);
}
vocab1 = vocabs[random1];
vocab2 = vocabs[random2];
vocab3 = vocabs[random3];
vocab4 = vocabs[random4];
Serial.println(vocab1);
Serial.println(vocab2);
Serial.println(vocab3);
Serial.println(vocab4);
Serial.println("//");
delay(1000);
german1 = strtok(vocab1,"/");
english1 = strtok(NULL,"/");
Serial.println(german1);
Serial.println(english1);
}
@L. Bogner, 👍0
Обсуждение2 ответа
Лучший ответ:
Лично я бы выбрал совершенно другой путь. Я бы сохранил пары слов как отдельные элементы внутри структуры:
struct wordpair {
const char *german;
const char *english;
};
struct wordpair pairs[] = {
{ "Apfel", "apple" },
{ "er", "he" },
{ "Zoo", "zoo" },
{ "sie", "she" },
{ "Hallo", "hello" },
};
#define NWORDS (sizeof(pairs) / sizeof(pairs[0]))
Теперь у вас есть мгновенный доступ к словам. Например:
pairs[3].german
это "sie"
и
pairs[3].english
это "она"
.
Вам не нужно тратить время на разделение слов, поскольку они уже разделены. Вам не нужно беспокоиться о том, что слова испортятся , потому что вы никогда ничего не записываете в слова. Действительно, если вы попытаетесь это сделать, поскольку они помечены как const
, компилятор должен будет пожаловаться.
Итак:
struct wordpair *vocab1 = &pairs[random1];
Serial.println(vocab1->german);
Макрос NWORDS
дает вам размер массива для удобства использования.
Создайте буфер, достаточно большой, чтобы вместить самую большую пару слов. Скопируйте выбранную пару в буфер и запустите strtok() в этом буфере. Strtok повредит содержимое буфера, но это пустяки; исходная строка пары слов остается неизменной.
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Извините за мой английский, @L. Bogner
Лично я бы сохранил их как отдельные слова в «структуре», чтобы объединить их в пары. Никакого разделения не требуется., @Majenko