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);
}
}
答案 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);
}
}
array[0]
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]
已经存在问题。