如何删除字符串中每次出现的元音

时间:2011-09-16 10:54:14

标签: c string

在学校作业中,我们被要求从字符串中删除每个元音的出现。

所以: “这个男孩踢球”会导致 “通过kckd th bll”

每当发现元音时,所有后续角色都必须向左移动,或者至少这是我的方法。因为我刚刚开始学习C,所以很可能这是一种荒谬的方法。

我要做的是:当我点击第一个元音时,我将下一个字符([i + 1])“移位”到当前位置(i)。然后必须为每个后续字符继续移位,因此int startshift设置为1,因此第一个if块在每次后续迭代时都会有所不同。

第一个if块也测试下一个char是否是元音。如果没有这样的测试,元音之前的任何字符都会“转换”到相邻的元音,除了第一个元音之外的每个元音仍然存在。然而,这导致每个元音被前面的char替换,因此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);

代码不起作用。

with text.txt:

The boy kicked the ball
He kicked it hard

./ oblig1删除test.txt产生:     那个男孩踢了球

e kicked it hard

NB。我省略了用于迭代文本文件中的行的外部while循环。

2 个答案:

答案 0 :(得分:4)

只是一些值得思考的东西,因为这是家庭作业,我不想破坏这种乐趣:

您也可以在不使用第二个“temp-&gt;数据”缓冲区的情况下解决此问题。如果给定的输入字符串位于可修改的内存块中,例如

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

您还可以编写一个程序来维护缓冲区中的两个指针:

  • 一个指针指向字符串中需要写下一个元音的位置;只要编写元音,这个指针就会前进。
  • 第二个指针指向字符串中要读取下一个要考虑的字符的位置;只要读取一个字符,该指针就会前进。

如果你考虑一下,你可以看到第一个指针不会像第二个指针一样快地前进(因为每个字符都被读出,但并不是每个字符都被写出 - 元音被跳过)。

如果您选择此路线,请考虑您可能需要正确终止字符串。

答案 1 :(得分:0)

尝试使用标准容器和对象

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