从字符串中删除元音

时间:2015-03-10 17:05:56

标签: c

我一直在尝试执行此功能,目标是删除字符串的元音。 这就是我所拥有的:

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

这似乎工作正常,但我想知道是否有更好的方法来执行此功能。有什么建议吗?

3 个答案:

答案 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;
}