如何删除字符串中的元音

时间:2015-05-10 16:48:33

标签: c string

我想编写一个程序来删除字符串中的元音。到目前为止,这是我的代码:

#include <stdio.h>
#include <string.h>

void f (char s[100])
{
    int ok=0;
    for (int i=0; i<strlen(s); i++)
    {
        if ((s[i]=='a')||(s[i]=='e')||(s[i]=='i')||(s[i]=='o')||(s[i]=='u'))
        {
            ok++;
            strcpy (s+i,s+i+1);
        }
    }
    printf ("%s",s);
}

int main ()
{
    f("alina");
    return 0;
}

当我编译它时,我的程序停止工作。当我调试它时会发生同样的情况:当我到达行strcpy (s+i,s+i+1);时,我收到一条错误消息:&#34;程序已停止工作&#34;。难道我做错了什么?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

问题在于,您正在调用

f("alina");

带有字符串文字"alina"),它通常出现在只读内存中,不可修改。任何修改字符串文字的尝试都将导致未定义的行为。

相反,您可以执行类似

的操作
int main (void)
{
    char arr[] = "alina";

    f(arr);
    return 0;
}

其中

  • 定义了一个名为arr
  • 的数组[modifiable]
  • 使用值"alina"
  • 初始化数组
  • 将数组传递给函数f()

另外,请记下main()的正确签名。

答案 1 :(得分:1)

您的计划有两个主要问题。

首先,字符串文字是不可变的。您可能无法更改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为。

其次,当范围相互重叠时,您可能不会使用strcpy。您应该使用strcpy

而不是memmove

来自C标准

  

如果在重叠的对象之间进行复制,行为就是   未定义

要始终复制字符串的整个部分以仅删除一个符号效率低下。

同样声明

printf ("%s",s);
应该从main中的函数移动

答案 2 :(得分:1)

对于这个问题,你可以使用twix技巧,又称双指法:

#include <stdio.h>
#include <string.h>

char *strip_vowels(char *s) {
    for (char *p1 = s, *p2 = s; (*p1 = *p2) != '\0'; p2++)
        p1 += !strchr("aeiou", *p1);
    return s;
}

int main(void) {
    char msg[] = "Hello world\n";
    fputs(strip_vowels(msg), stdout);
    return 0;
}