【问题标题】:How to erase every occurences of vowels in a string如何擦除字符串中每一次出现的元音
【发布时间】:2011-11-18 14:35:21
【问题描述】:

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

所以: “男孩踢球”会导致 "Th by kckd th bll"

每当找到元音时,所有后续字符都必须以某种方式向左移动,或者至少这是我的方法。由于我刚开始学习 C,很可能这是一种荒谬的方法。

我想要做的是:当我击中第一个元音时,我将下一个字符([i+1])“转移”到当前的位置(i)。然后必须为每个后续字符继续移位,因此 int startshift 设置为 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);

代码不起作用。

带有文本.txt:

The boy kicked the ball
He kicked it hard

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

e kicked it hard

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

【问题讨论】:

  • 很遗憾您的代码示例不完整;至少缺少一些函数签名。

标签: c string


【解决方案1】:

只是一些思考的食物,因为这是家庭作业,我不想破坏乐趣:

您也可以在不使用第二个“temp->data”缓冲区的情况下解决这个问题。如果给定的输入字符串在一个可修改的内存块中,比如

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

你也可以写一个程序,维护两个指向缓冲区的指针:

  • 一个指针指向字符串中需要写入下一个元音的位置;每当写入元音时,此指针就会前进。
  • 第二个指针指向字符串中要读取的下一个字符的位置;每当读取一个字符时,此指针就会前进。

如果你仔细想想,你会发现第一个指针不会像第二个指针那样快(因为每个字符都被读取,但不是每个字符都被写出 - 元音被跳过)。

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

【讨论】:

  • 当然,如果您使用单独的缓冲区作为目标,则有关两个指针的相同内容也适用。
  • 另外,只是为了让工作更容易在数据[]中的字符和要检查的元音之间进行检查,如果它们不是元音,则将其添加到字符串中。
【解决方案2】:

尝试使用标准容器和对象

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多