(C ++)这段代码出了什么问题?请

时间:2016-01-18 10:02:59

标签: c++

我必须加倍元音(例如:home - > hoomee,shooter - > shooooteer)。 我做错了什么?

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    char s[100],*p;
    unsigned int i,j;
    cin.get(s,100);
    p=s;
    for(i=0;i<=strlen(p);i++)
    {
        if((p[i]=='a')||(p[i]=='e')||(p[i]=='i')||(p[i]=='o')||(p[i]=='u'))
        {
            for(j=strlen(p);j>p[i];j--)
                p[j]=p[j-1];
            p[i+1]=p[i];
            p++;
        }
    }
    cout<<p;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

考虑p ++;每次执行此操作时,将指针p移动到1位置,这样最终p将不会指向缓冲区s的第一个元素。

答案 1 :(得分:1)

在本声明中

for(j=strlen(p);j>p[i];j--)
    p[j]=p[j-1];

至少有两个错误。第一个是j设置为strlen( p ),然后覆盖终止零。

第二个条件是条件j>p[i]应至少写成j > i

然后在循环指针p被更改后

p++;

结果表达式strlen(p)将为字符串的长度提供不正确的值。

程序可以按以下方式查看

#include <iostream>
#include <cstring>
#include <cctype> 

int main()
{
    while ( true )
    {
        const size_t N = 100;
        char s[N];
        s[0] = '\0';

        std::cout << "Enter a string (empty string - exit): ";
        std::cin.getline( s, N );

        if ( s[0] == '\0' ) break;

        const char *vowels = "AEIOU";

        size_t n = std::strlen( s );

        for ( char *p = s; *p; ++p )
        {
            if ( std::strchr( vowels, std::toupper( ( unsigned char )*p ) ) )
            {
                if ( n + 1 < N )
                {
                    ++n;
                    std::memcpy( p + 1, p, n - ( p - s ) );
                }
                else
                {                    
                    std::memmove( p + 1, p, n - ( p - s ) - 1 );
                }                    
                ++p;
            }
        }

        printf( "\"%s\"\n", s );
    }        
}

如果首先进入

home

然后

shooter

最后按Enter键,输出显示为

Enter a string (empty string - exit): home
"hoomee"
Enter a string (empty string - exit): shooter
"shooooteer"
Enter a string (empty string - exit):