Удаление определенных символов из строки
- Войдите на сайт для отправки комментариев
Пнд, 16/10/2017 - 18:38
Доброго времени суток, Ардуинщики. Препод нам дал задание: написать программу, удаляющую символы из строки. Соответственно, я разбила эту задачу на два этапа: чтение слова+обнуление массива для принятия нового слова (пригодится потом для ввода нового слова) и удаление непосредственно букв. Приступила к выполнению первой части поставленной задачи, код прилагаю. К сожалению он работает только 9 раз, потом при нажатии enter просто ничего не происходит. Почему?
char WORD[10];
char LETTER;
int i=0;
void setup() {
Serial.begin(9600);
Serial.write("Write smth");
}
void loop() {
while (Serial.available())
{
WORD[i] = Serial.read();
if (WORD[i] == '\n')
{
Serial.write('\n');
Serial.write("The word is ");
while(i < 10)
{
WORD[i] = '\0';
i++;
}
for (int k=0; k<i; k++)
{
Serial.print(WORD[k]);
}
for (int k=0; k<i; k++)
{
WORD[k]=0;
}
}
i++;
}
}
while(i < 100500)будет работать 100499 рас
*не благодари.
while(i < 100500)будет работать 100499 рас
неа... Будет работать столько же, как и у автора.
Чем больше кол-во "осторожно, специалист!" на просторах - тем лучше для мну - работы будет больше.
Пользуйтесь:
char buffer[20]; byte writeIterator; void printWord() { Serial.print("Word is: "); Serial.println(buffer); } void clearWord() { memset(buffer,'\0',sizeof(buffer)); } void setup() { Serial.begin(9600); writeIterator = 0; } void loop() { while(Serial.available()) { char ch = Serial.read(); if(ch == '\r') continue; else if(ch == '\n' || writeIterator >= sizeof(buffer)-1 ) { buffer[writeIterator] = '\0'; printWord(); clearWord(); writeIterator = 0; } else { buffer[writeIterator] = ch; writeIterator++; } } }Заодно есть проверка на невыполз за границы массива. Единственное "но" - не заливал и не тестировал, банально лень :)
lisishe-fox, Вы забыли обнулить i сразу после строки 10. Сначала она у Вас и так 0, а потом всё идёт вразнос.
Так, хорошо, спасибо, поняла, что необходимо обнуление. Доделала программу: пишешь слово - enter - пишешь букву - enter - он выдает количество повторов этой буквы - снова пишешь букву - enter - он букву удаляет из слова. Все выполняется, но только 1 раз, почему? Что не так в обнулении?
bool toWrite=1; bool toDelete=0; bool toCount=0; bool canDelete=0; int c = 0; char WORD[10]; char LETTER[2]; int numberOfTheSame; int lastPosition = 0; int i=0; int z=0; void setup() { Serial.begin(9600); Serial.write("Write me something"); } void loop() { // 1 - записываем слово; while (Serial.available() && toWrite) { WORD[i] = Serial.read(); if (WORD[i] == '\n') { delay(10); toWrite = !toWrite; toCount=!toCount; Serial.write('\n'); Serial.write("The word is "); while(i < 10) { WORD[i] = '\0'; i++; } for (int k=0; k<i; k++) { Serial.print(WORD[k]); } Serial.write('\n'); Serial.write("write the letter"); } i++; } // 2 - подсчитываем количество нужного символа в слове while (Serial.available() && toCount) { LETTER[c] = Serial.read(); if(LETTER[c] == '\n') { toCount=!toCount; toDelete=!toDelete; for (int k=0; k<i; k++) { if(WORD[k] == LETTER[0]) numberOfTheSame++; } Serial.write('\n'); Serial.write("The ammount of this letter in your word is "); Serial.print(numberOfTheSame); Serial.write('\n'); Serial.write("Write the letter again"); } c++; } // 3 - удаляем нужный символ while (Serial.available() && toDelete) { LETTER[z] = Serial.read(); if(LETTER[z] == '\n') { delay(10); toDelete=!toDelete; canDelete=!canDelete; Serial.write('\n'); Serial.write("letter is "); while(z < 2) { LETTER[z] = '\0'; z++; } Serial.write(LETTER[0]); Serial.write('\n'); for (int k=0; k<i; k++) { if(WORD[k] == LETTER[0]) WORD[k] = '\0'; } Serial.write("the word is "); for (int k=0; k<i; k++) { Serial.print(WORD[k]); } } z++; } // 4 - обнуление данных. Запрос на новое слово. if(canDelete) { c, i, z, numberOfTheSame = 0; for (int k=0; k<10; k++) { WORD[k]=0; } for (int k=0; k<2; k++) { LETTER[k]=0; } Serial.write('\n'); Serial.write("You can write me something again"); toWrite=1; toDelete=0; toCount=0; canDelete=0; } }Так, заработало! Но появился новый вопрос: почему при прогоне в конце слова появляется символ "квадратик"? код особо не изменился, но прилагаю:
bool toWrite=1; bool toDelete=0; bool toCount=0; bool canDelete=0; int c = 0; char WORD[10]; char LETTER[2]; int numberOfTheSame; int lastPosition = 0; int i=0; int z=0; void setup() { Serial.begin(9600); Serial.write("Write me something"); } void loop() { // 1 - записываем слово; while (Serial.available() && toWrite) { WORD[i] = Serial.read(); if (WORD[i] == '\n') { delay(10); toWrite = !toWrite; toCount=!toCount; Serial.write('\n'); Serial.write("The word is "); while(i < 10) { WORD[i] = '\0'; i++; } for (int k=0; k<i; k++) { Serial.print(WORD[k]); } Serial.write('\n'); Serial.write("write the letter"); } i++; } // 2 - подсчитываем количество нужного символа в слове while (Serial.available() && toCount) { LETTER[c] = Serial.read(); if(LETTER[c] == '\n') { toCount=!toCount; toDelete=!toDelete; for (int k=0; k<i; k++) { if(WORD[k] == LETTER[0]) numberOfTheSame++; } Serial.write('\n'); Serial.write("The ammount of this letter in your word is "); Serial.print(numberOfTheSame); Serial.write('\n'); Serial.write("Write the letter again"); } c++; } // 3 - удаляем нужный символ while (Serial.available() && toDelete) { LETTER[z] = Serial.read(); if(LETTER[z] == '\n') { delay(10); toDelete=!toDelete; canDelete=!canDelete; Serial.write('\n'); Serial.write("letter is "); while(z < 2) { LETTER[z] = '\0'; z++; } Serial.write(LETTER[0]); Serial.write('\n'); for (int k=0; k<i; k++) { if(WORD[k] == LETTER[0]) WORD[k] = '\0'; } Serial.write("the new word is "); for (int k=0; k<i; k++) { Serial.print(WORD[k]); } } z++; } // 4 - обнуление данных. Запрос на новое слово. while(canDelete) { c =0, i=0, z=0, numberOfTheSame = 0; for (int k=0; k<10; k++) { WORD[k]='\0'; } for (int k=0; k<2; k++) { LETTER[k]='\0'; } Serial.write('\n'); Serial.write("You can write me something again"); toWrite=1; toDelete=0; toCount=0; canDelete=0; } }