我必须加倍元音(例如: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;
}
答案 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):