删除字符串中的元音。我究竟做错了什么?

时间:2015-05-19 14:34:40

标签: c arrays string logical-operators

我试图通过将所有辅音放入不同的数组然后将第一个数组重新初始化为第二个数组来删除字符串的所有元音。之后,应该打印第一个数组,即只有辅音。我真的不确定问题出在哪里,我一直在看这个问题好三个小时,我已经厌倦了。

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

int main()
{
    char str [100];
    char garbage[100];
    int loopcondition = 0 , j = 0 , k = 0;
    int userinput;
    char a = "a" , e = "e" , i = "i", o = "o" , u = "u";

    printf("!!!Hello World!!! Please type in a string from which I can  remove all the vowels:\n");

    //This program is supposed to take in a string and then delete all the vowels

    gets(str); //gets user input

    userinput = strlen(str); //makes userinput equal to the length of the string

    while(loopcondition < userinput) //the loop runs until the condition is no longer smaller than the input
    {
        loopcondition++;    //incrementation of condition
        if(str[j] != a || e || i || o || u) // this should check wether the current position in the array is a vowel
        {
            garbage[k] = str[j] ; //if it's not the it puts the current character into the garbage array
            k++;        //iteration of the garbage array position
        };
        j++; //incrementation of string array position
    };

    garbage[k] = '\0';
    strcpy (str , garbage ); //this copies the string?!?! aka reinitiliazing array variable
    printf("%s" , str);
    return 0;
}

4 个答案:

答案 0 :(得分:7)

您的char初始化应该是

char a = 'a' , e = 'e' , i = 'i', o = 'o' , u = 'u';

请记住,双引号" ")适用于字符串文字单引号({{1 }})用于字符文字

然后,

''

这不是你在c中使用逻辑OR( if(str[j] != a || e || i || o || u) )运算符的方式。链接是不可能的。你必须分别检查每个条件。像

这样的东西
||

但是,在我看来,如果你改变逻辑以使用if( (str[j] != a) && (str[j] != e) && (str[j] != i).......//so on 案例,那么它将是一个更好的设计。

哦,最好使用switch,这是标准中推荐的。

答案 1 :(得分:0)

char str [100];
char *src;          // source position of copying characters
char *dst;          // destination position 

...........

gets(str); //gets user input
printf( "Input: %s\n" , str);

for( dst = src = str; *src; src++ )       // scan chars of the string
{
    if( *src != 'a' && *src != 'e' &&     // check if a vowel
        *src != 'i' && *src != 'o' && *src != 'u')
    {
        * dst ++ = * src;                 // no? copy it
    };
}
*dst = 0;  // ASCII NUL (zero) char to terminate the string

printf( "Result: %s\n" , str);

for循环使用src指针扫描整个字符串,从开头(str)开始直到结束(一个零字符,ASCII NUL,由{{检测到1}}表达式,相当于*src)。

每个角色都经过测试,如果它不是元音,则会被复制到*src != 0位置,然后由{1} dest推进。* dst ++ = * srcdest变量最初设置为str,因此除了元音外,所有字符都在字符串的初始部分逐个复制。最后一个赋值(*dst = 0)终止字符串。

答案 2 :(得分:0)

使用strchr

之类的内容
char vowels = "aeiou";
if (strchr(vowels, 'x'))
 // Then 'x' is a vowel.

答案 3 :(得分:0)

无论如何你一次要检查一个字符是否是元音,所以不是使用(不安全)$( document ).ready()或者根本不使用多个数组,你可以只使用gets()将非元音添加到数组中。这简化了逻辑的其余部分,因此您可以使用指针。

getchar()

或使用#include <stdio.h> //for puts and getchar int main(void){ char s[128], *sp = s, *end = sp + sizeof(s) - 1; puts("Please type in a string"); while ((*sp=getchar())!='\n' && sp<end){ switch(*sp|32){ // |32 will catch uppercase vowels too case 'a': case 'e' : case 'i' : case 'o' : case 'u' : continue; //*sp will be overwritten default : sp++; } } *sp=0; puts(s); }

strch()