Удаление определенных символов из строки

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Доброго времени суток, Ардуинщики. Препод нам дал задание: написать программу, удаляющую символы из строки. Соответственно, я разбила эту задачу на два этапа: чтение слова+обнуление массива для принятия нового слова (пригодится потом для ввода нового слова) и удаление непосредственно букв. Приступила к выполнению первой части поставленной задачи, код прилагаю. К сожалению он работает только 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++;
    
  }
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

while(i < 100500)

будет работать 100499 рас

*не благодари.

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 112 пишет:

while(i < 100500)

будет работать 100499 рас

неа... Будет работать столько же, как и у автора.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Чем больше кол-во "осторожно, специалист!" на просторах - тем лучше для мну - работы будет больше.

Пользуйтесь:

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

Заодно есть проверка на невыполз за границы массива. Единственное "но" - не заливал и не тестировал, банально лень :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lisishe-fox, Вы забыли обнулить i сразу после строки 10. Сначала она у Вас и так 0, а потом всё идёт вразнос.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Так, хорошо, спасибо, поняла, что необходимо обнуление. Доделала программу: пишешь слово - 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;
      }
      
 }
      

 

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Так, заработало! Но появился новый вопрос: почему при прогоне в конце слова появляется символ "квадратик"? код особо не изменился, но прилагаю:

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Сначала Вы в строках 88-92 заменяете нужную букву на 0. Затем, печатаете слово с этим самым нулём. Он (ноль) не печатается, но гадит.
 
Удаляйте букву нормально, чтобы её там совсем не было (ни её, ни нуля) и не забывайте, что при этом длина слова уменьшится на 1.
 
Да, кстати, Вам надо одну букву удалять или все такие буквы? Вы удаляете одну.