将特定字符插入字符串中

时间:2013-12-14 13:03:42

标签: c string

for ex:if string =" EXAM" 插入一个char' x'在字符串的每个字符之后 输出必须是string =" EXXXAXMX" .i为此完成了程序,但我存储了一个字符串,然后我插入了' x'但我希望pgm从用户获取输入字符串插入一个char' x'在该字符串的每个字符之后如何做?

#include<stdio.h>
#include<conio.h>
#include<string.h>
void strexpand(char [],char []);
void main()
{
  char name[]="EXAM";
  int length;
  clrscr();
  length=strlen(name);
  printf("\n\tName=%s Length=%d",name,length);
  strexpand(name);

  getch();
}
void strexpand(char name[])
{ 
  int i;
  while(name[i]!='\0')
  {
    i++;
  }
  if(name[i]=='\0')
  {
    name[8]=name[4];
    name[6]=name[3];
    name[4]=name[2];
    name[2]=name[1];
    name[1]='x';
    name[3]='x';
    name[5]='x';
    name[7]='x';
    printf("\n\n\tAltered string is=%s",name);
  }
}

2 个答案:

答案 0 :(得分:1)

它应该是这样的,新字符串总是比原始字符串大2倍,所以我们应该将它分配为2倍大字符串,然后按照我在评论中说的那样复制。

 char* strexpand(char name[]) 
 {
          int length=0;
          int i=0 ,j=0;
          char* retValue =null;


          while(name[length]!='\0')
          {
             length++;
          }
            length++;

          retValue = malloc (sizeof(char* length * 2));
          if(!retValue)
               return null;
         for(i=0;i<length;i++,j+=2)
         {
             retVal[j] = name[i];
             retVal[j+1] = 'x';
         }
         //at this point j did got +=2 
         retVal[j] = '\0';

         return retVal;
     }

答案 1 :(得分:0)

修复

#include<stdio.h>
#include<conio.h>
#include<string.h>
void strexpand(char []);
void main()
{
  char name[9];
  strcpy(name, "EXAM");
  int length;
  length=strlen(name);
  printf("\n\tName=%s Length=%d",name,length);
  strexpand(name);

  getch();
}
void strexpand(char name[])
{ 
  int i=0;
  while(name[i]!='\0')
  {
    i++;
  }
  if(name[i]=='\0')
  {
    name[7]=name[3];
    name[5]=name[2];
    name[3]=name[1];
    name[1]=name[0];
    name[0]='x';
    name[2]='x';
    name[4]='x';
    name[6]='x';
    name[8] = '\0';
    printf("\n\n\tAltered string is=%s",name);
  }
}
  • note1:此代码假定字符串最多包含8个字符。
  • note2:数组的索引编号为0.第一个元素是array[0]
  • note3:行name[8] = '\0';负责关闭字符串,因为C字符串是null-terminated。重要的是要知道要将n个字符存储在C字符串中,您总是需要n+1个字节。

一些解释

void strexpand(char name[])
{ 
  int i;
  while(name[i]!='\0')
  {
    i++;
  }

这部分是有问题的,因为i会有一些垃圾值。它应该是

void strexpand(char name[])
{ 
  int i = 0;
  while(name[i]!='\0')
  {
    i++;
  }

同样在使用strexpand时,你会认为它的参数至少包含9个元素:

name[8]

如果给它一个小于9个元素的字符串(如代码中那样),代码将尝试访问分配空间之外的元素,这将导致段错误。

所以,当你用“EXAM”调用它时,参数在内存中看起来像这样:

['E','X','A','M','\0']

鉴于此,name[5]已经存在问题。