Как стирать все вхождения гласных в струне - PullRequest
0 голосов
/ 16 сентября 2011

В школьном задании нас просят убирать все гласные в строке.

Итак: «Мальчик пнул мяч» приведет к "Th by kckd th bll"

Всякий раз, когда обнаруживается гласная, все последующие символы так или иначе должны сдвигаться влево, или, по крайней мере, это мой подход. Поскольку я только начал изучать C, вполне возможно, что это нелепый подход.

То, что я пытаюсь сделать, это: Когда я нажимаю первую гласную, я «сдвигаю» следующий символ ([i + 1]) на текущий pos (i). Затем сдвиг должен продолжаться для каждого последующего символа, поэтому int начальное смещение устанавливается на 1, поэтому первый блок if выполняет исключение на каждой последующей итерации.

Первый блок if также проверяет, является ли следующий символ гласным. Без такого теста любой символ, предшествующий гласному, «трансформируется» в соседний гласный, и все гласные, кроме первого, все равно будут присутствовать. Однако это привело к тому, что каждый гласный был заменен предшествующим символом, отсюда и блок if else.

В любом случае, этот уродливый код - это то, что я придумал до сих пор. (Имена, используемые для указателей типа char *, не имеют смысла (я просто не знаю, как их назвать), и наличие двух их наборов, вероятно, является избыточным.

char line[70];

char *blank;
char *hlp;

char *blanktwo;
char *hlptwo;


strcpy(line, temp->data);

int i = 0;
int j;

while (line[i] != '\n') {

  if (startshift && !isvowel(line[i+1])) { // need a test for [i + 1] is vowel

blank = &line[i+1]; // blank is set to til point to the value of line[i+1]
hlp = &line[i]; // hlp is set to point to the value of line[i]

*hlp = *blank; // shifting left

  } else if (startshift && isvowel(line[i+1])) {

blanktwo = &line[i+1]; 
hlptwo = &line[i];

*hlptwo = *blanktwo;

//*hlptwo = line[i + 2]; // LAST MOD, doesn't work


  }

  for (j = 0; j < 10; j++) { // TODO: j < NVOWELS

if (line[i] == vowels[j]) { // TODO: COULD TRY COPY EVERYTHING EXCEPT VOWELS
  blanktwo = &line[i+1]; 
  hlptwo = &line[i];

  *hlptwo = *blanktwo;

  startshift = 1;

}

  }

  i++;

}

printf("%s", line);

Код не работает.

с text.txt:

The boy kicked the ball
He kicked it hard

. / Require1 remove test.txt создает: Че мальчик ударил по мячу

e kicked it hard

NB. Я опустил внешний цикл while, используемый для перебора строк в текстовом файле.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Просто пища для размышлений, так как это домашняя работа, и я не хочу портить удовольствие:

Вы также можете решить эту проблему, не используя второй буфер «temp-> data». Если заданная входная строка находится в модифицируемом фрагменте памяти, например

char data[] = "The boy kicked the ball";

Вы также можете написать программу, которая поддерживает два указателя в буфере:

  • Один указатель указывает на позицию в строке, где должна быть написана следующая гласная; этот указатель продвигается всякий раз, когда пишется гласная.
  • Второй указатель указывает на позицию в строке, из которой читается следующий рассматриваемый символ; этот указатель продвигается всякий раз, когда читается символ.

Если вы подумаете об этом, вы увидите, что первый указатель не будет продвигаться так быстро, как второй указатель (поскольку каждый символ читается, но не каждый символ записывается - гласные пропускаются).

Если вы идете по этому маршруту, учтите, что вам может потребоваться правильно завершить строку.

0 голосов
/ 11 февраля 2015

Попробуйте использовать стандартные контейнеры и объекты

#include <iostream>
#include <string>
#include <vector>

std::string editStr = "qweertadoi";
std::vector<char> vowels{'i', 'o', 'u', 'e', 'a'};

int main() {

    for(unsigned int i = 0; i<editStr.size(); i++){
        for(char c: vowels){
            if(editStr.at(i) == c){
                editStr.erase(i--,1);
                break;
            }
        }
    }

    std::cout << editStr << std::endl; 
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...