在学校作业中,我们被要求从字符串中删除每个元音的出现。
所以: “这个男孩踢球”会导致 “通过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循环。
答案 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;
}