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);
}

, 👍0

Обсуждение

Извините за мой английский, @L. Bogner

Лично я бы сохранил их как отдельные слова в «структуре», чтобы объединить их в пары. Никакого разделения не требуется., @Majenko


2 ответа


Лучший ответ:

0

Лично я бы выбрал совершенно другой путь. Я бы сохранил пары слов как отдельные элементы внутри структуры:

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 дает вам размер массива для удобства использования.

,

1

Создайте буфер, достаточно большой, чтобы вместить самую большую пару слов. Скопируйте выбранную пару в буфер и запустите strtok() в этом буфере. Strtok повредит содержимое буфера, но это пустяки; исходная строка пары слов остается неизменной.

,