Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何删除字符串中的元音_C_String - Fatal编程技术网

C 如何删除字符串中的元音

C 如何删除字符串中的元音,c,string,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')) {

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

#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;
}
#包括
#包括
空f(字符s[100])
{
int ok=0;

对于(inti=0;i这里的问题是,您正在呼叫

f("alina");
使用字符串文字(
“alina”
),该文字通常存在于只读内存中且不可修改。任何修改字符串文字的尝试都将导致未定义的行为

相反,你可以做如下的事情

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

    f(arr);
    return 0;
}
哪个

  • 定义一个名为
    arr
  • 使用值初始化数组
    “alina”
  • 将数组传递给函数
    f()

另外,记下
main()

的正确签名这里的问题是,您正在呼叫

f("alina");
使用字符串文字(
“alina”
),该文字通常存在于只读内存中且不可修改。任何修改字符串文字的尝试都将导致未定义的行为

相反,你可以做如下的事情

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

    f(arr);
    return 0;
}
哪个

  • 定义一个名为
    arr
  • 使用值初始化数组
    “alina”
  • 将数组传递给函数
    f()

另外,请注意
main()

的正确签名程序中有两个主要问题

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

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

来自C标准

如果复制发生在重叠的对象之间,该行为是 未定义

而且,总是复制字符串的整个部分以仅删除一个符号是低效的

还声明

printf ("%s",s);

应该从main中的函数中删除。

程序中存在两个主要问题

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

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

来自C标准

如果复制发生在重叠的对象之间,该行为是 未定义

而且,总是复制字符串的整个部分以仅删除一个符号是低效的

还声明

printf ("%s",s);

应该从main中的函数中删除。

对于此问题,您可以使用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;
}
#包括
#包括
char*strip_元音(char*s){
对于(char*p1=s,*p2=s;(*p1=*p2)!='\0';p2++)
p1+=!strhr(“aeiou”、*p1);
返回s;
}
内部主(空){
char msg[]=“你好,世界\n”;
fputs(strip_元音,msg),stdout);
返回0;
}

对于此问题,您可以使用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;
}
#包括
#包括
char*strip_元音(char*s){
对于(char*p1=s,*p2=s;(*p1=*p2)!='\0';p2++)
p1+=!strhr(“aeiou”、*p1);
返回s;
}
内部主(空){
char msg[]=“你好,世界\n”;
fputs(strip_元音,msg),stdout);
返回0;
}
如果你说的是“string literal”而不是“string”,这是对的……但是原始代码和你的代码都传递一个“string”。如果你说的是“string literal”而不是“string”,这是对的……但是原始代码和你的代码都传递一个“string”。