我需要用一个字符替换几个字符(取决于它们的计数是偶数还是奇数)。如果是偶数,我应该用P替换+,如果p奇数。
输入:kjlz ++ zux +++
while(p[i])
{
j=i;
k=i;
length=strlen(p);
if(p[i]=='*')
{
position=i;
}
printf("Position is: %d", position);
while(p[j]=='*')
{
counter++;
j++;
}
}
输出:kjlzPzuxp
我不确定如何删除几个我知道该怎么输入的字符。
答案 0 :(得分:1)
基本上,您可以保持 text 变量不变,直到找到+。在这种情况下,您开始计算有多少个连续的加号。一旦知道这一点,就可以决定是否应添加字母P或p。保留一个单独的索引以写回您的文本变量!否则,在发现2或3个加号之后,它将开始写入错误的索引,请尝试找出原因;)。
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char text[] = "kjlz++zux+++";
int len = sizeof(text) / sizeof(text[0]);
int index = 0, count = 0;
for(int i = 0; i < len; i++)
{
if(text[i] == '+')
{
count = 0;
while(text[i] == '+') i++, count++;
i--;
text[index++] = count % 2 ? 'p' : 'P';
}
else
{
text[index++] = text[i];
}
}
text[index] = 0;
printf(text);
}
您可以使用 malloc 为 text 变量分配空间,以便以后可以使用 realloc 将数组缩小到输出文字。这样可以节省一些内存,当您开始处理更大的数据块时,这一点尤其重要。
答案 1 :(得分:1)
如果我已正确理解,您将不知道如何实现相应的功能。
它可以按照演示程序中所示的方式进行查找。
#include <stdio.h>
char * replace_pluses( char *s )
{
const char plus = '+';
const char odd_plus = 'p';
const char even_plus = 'P';
char *dsn = s;
for ( char *src = s; *src; )
{
if ( *src == plus )
{
int odd = 1;
while ( *++src == plus ) odd ^= 1;
*dsn++ = odd ? odd_plus : even_plus;
}
else
{
if ( dsn != src ) *dsn = *src;
++dsn;
++src;
}
}
*dsn = '\0';
return s;
}
int main(void)
{
char s[] = "kjlz++zux+++";
puts( s );
puts( replace_pluses( s ) );
return 0;
}
程序输出为
kjlz++zux+++
kjlzPzuxp
或者您可以编写一个更通用的函数
#include <stdio.h>
char * replace_odd_even_duplicates( char *s, char c1, char c2, char c3 )
{
char *dsn = s;
for ( char *src = s; *src; )
{
if ( *src == c1 )
{
int odd = 1;
while ( *++src == c1 ) odd ^= 1;
*dsn++ = odd ? c2 : c3;
}
else
{
if ( dsn != src ) *dsn = *src;
++dsn;
++src;
}
}
*dsn = '\0';
return s;
}
int main(void)
{
char s[] = "kjlz++zux+++";
puts( s );
puts( replace_odd_even_duplicates( s, '+', 'p', 'P' ) );
return 0;
}