【问题标题】:Vowels in string C++字符串 C++ 中的元音
【发布时间】:2014-02-16 12:10:31
【问题描述】:

我应该输入字符串,我的程序应该重新组织元素,因此塞尔维亚元音 (a,o,i,e,u) 应该是第一个元素,然后是辅音。我的想法是在第二个字符串中复制元音,在第三个字符串中复制辅音然后制作一个字符串(使用 strcat 和元音和辅音字符串),但这并没有按计划工作......任何想法要改变什么或如何做?

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

int main()
{
    char s[50],s2[50];
    char vowels[50];
    char consonant[50];
    int k=0,f=0; 

    printf("Type string:\n");
    gets(s);


    for(int i;i<strlen(s);i++)
    {
        if(s[i]={'A','O','I','E','U','a','o','i','e','u'}) s[i]=vowels[k],k++;
        else  s[i]=consonant[f],f++;
    }

    strcat(vowels,consonant);

     printf("%s",vowels);

    return 0;

}

【问题讨论】:

  • 你觉得这条线有什么作用? if(s[i]={'A','O','I','E','U','a','o','i','e','u'}
  • 我认为您的想法可行,但s[i] = {...} 不是您检查一个值是否是多个值之一的方式。您可以做很多if (s[i] == 'a' || s[i] == 'o' ... ) 或使用strchr 之类的东西来查看一个字符是否是字符串的一部分。
  • @PaulMcKenzie 这取决于您获得的 c++ 版本...它的扩展元素列表...仍然可能有问题会尝试更改它
  • @MatsPetersson 在学校很好,我的教授把这个作为搜索扩展列表的例子,所以我认为如果 if()||... 使用它而不是列出所有元素更容易
  • @user3127589 - 这不是合法的 C++。

标签: c++ string


【解决方案1】:

if(s[i]={'A','O','I','E','U','a','o','i','e','u'}) 不是合法的 C++

考虑使用std::strchr,并使用您的 C 风格逻辑。

更好的划分方式(元音和辅音)可能是: 通过使用std::partition(因为它被标记为 C++)

bool is_vowel(char ch) { return std::strchr("aeiouAEIOU", ch) != NULL ; }

std::string s; //use std::string
std::string::const_iterator p =
        std::partition(s.begin(), s.end(), 
                       std::ptr_fun(is_vowel));

查看演示here

另外,避免使用gets,在 C++ 中使用std::getline

【讨论】:

【解决方案2】:

虽然您的问题是针对 C++ 的,但您似乎在处理 C。

试试下面的代码。

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

int main( void )
{
    const size_t N = 50;
    const char vowels[] = { 'A', 'O', 'I', 'E', 'U', 'a', 'o', 'i', 'e', 'u', '\0' };
    char s[N], s1[N], s2[N];

    printf( "Type string: " );
    fgets( s, N, stdin );

    char *p1 = s1,*p2 = s2;
    for ( char *q = s; *q; ++q )
    {
        if ( strchr( vowels, *q ) )
        {
            *p1++ = *q;
        }
        else
        {
            *p2++ = *q;
        }
    }

    *p1 = '\0';
    *p2 = '\0';

    strcpy( s, s1 );
    strcat( s, s2 );

    printf( "result string: \"%s\"", s );

    return 0;
}

如果您的编译器不支持 C99,则按以下方式更改循环

    char *q = s, *p1 = s1,*p2 = s2;
    for ( ; *q; ++q )

并将所有变量定义放在main的开头

也可以替换

const size_t N = 50;

#define N 50

至于你的代码然后这个构造

for(int i;i<strlen(s);i++)
{
    if(s[i]={'A','O','I','E','U','a','o','i','e','u'}) s[i]=vowels[k],k++;
    else  s[i]=consonant[f],f++;
}

无效,没有意义。

【讨论】:

    【解决方案3】:

    使用 strchr:

    #include <cstring>
    const char* vowel = "aeiouAEIOU";
    //...
    const char* p = strchr(vowel, str[i]);
    if ( p )
    {
        // p points to the vowel found
    }
    

    【讨论】:

      【解决方案4】:

      我只想添加一条评论,但声誉太低……在我看来:

      s[i]=元音[k], k++

      是错误的方式,当然应该是“vowels[k] = s[i], k++”,可以改进为“vowels[k++] = s[i]”。当然,辅音也是如此。

      此外,在执行 strcat 之前,您应该在两个字符串中添加一个终止零字符:

      vowels[k] = (char)0;
      consonant[f] = (char)0;
      

      否则字符串没有正确终止 - 你不能假设 char 数组被初始化为全零。

      当然,上面 Paul 的建议是检测元音的一种更简洁的方法......

      【讨论】:

      • 谢谢帮助我很感激我同意保罗的想法更好,但这是我的,所以我必须先尝试修复我的,然后再使用其他人:D
      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 2021-05-23
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多