我一直在尝试执行此功能,目标是删除字符串的元音。 这就是我所拥有的:
void
take_vowels (char s[])
{
int i;
char r[4];
for (i = 0; i <= strlen (s); i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o'
|| s[i] == 'u')
{
r[i] = ' ';
}
else
{
r[i] = s[i];
}
}
printf ("%s\n", r);
}
int
main ()
{
char s[4] = { 'a', 'e', 'k', };
take_vowels (s);
return 0;
}
这似乎工作正常,但我想知道是否有更好的方法来执行此功能。有什么建议吗?
答案 0 :(得分:1)
您的函数的问题在于它具有未定义的行为,因为源数组可以包含4个以上的字符。 该函数不会从源字符串中删除元音。它将源字符串复制到本地数组中,用空格替换元音。
所以这个功能没有按照宣布的那样做。
答案 1 :(得分:0)
你的标题是&#39;从字符串中删除元音&#39;,但实际上你是用空格替换元音。
您根本不需要strlen
。你只需要记住你的字符串(根据定义)已经足够大了,它是一个字符序列。另外,switch
语句比大if
更好,你可能想要处理这两种情况。
将char *s
作为参数而不是char s[]
也是正常的。查看标准库中的每个字符串函数!同样,初始化C字符串的常规方法是:
char *s = "aek";
不
char s[4] = { 'a', 'e', 'k', };
这里有两个(未经测试的)功能,可以提供帮助:
#include <ctype.h>
...
void
replacevowelsbyspace (char *s)
{
for (; *s; s++)
{
switch (tolower (*s))
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
*s = ' ';
default:
break;
}
}
}
和
#include <ctype.h>
...
void
deletevowels (char *s)
{
char *d = s;
for (; *s; s++)
{
switch (tolower (*s))
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
break;
default:
*d++ = *s;
}
}
*d = 0;
}
答案 2 :(得分:0)
int vowel(char ch)
{
if((ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')||
(ch=='A'||ch=='E'||ch=='I'||ch=='O'||ch=='U'))
return 1;
else
return 0;
}
void removevowel(char str[])
{
int count=0,i=0;
while(str[i]!='\0')
{
if(!vowel(str[i]))
{str[count++]=str[i];}
i++;
}
str[count]='\0';
}
int main()
{
char str[]="stAck overflOw SamplE";
removevowel(str);
for(int j=0; str[j]; j++)
cout<<str[j];
return 0;
}