C语言编程题在屏幕上输入一个字符串和一个要插入的字符

在屏幕上输入一个字符串和一个要插入的字符,并输入要插入的位置, 会在指定位置插入字符并输出
#include<stdio.h>
#include<string.h>
insert(int s[],char t,int i);
main()
{
int str1[100],c;
int position;
printf("please input string:\n");
gets(str1);
printf("piease input a char:\n ");
scanf("%c",&c);
printf("please input position:\n");
scanf("%d",&position);
insert(str1,c,position);
puts(str1);
}
insert(int s[],char t,int i)
{
int string[100];
if(!strlen(s))
string[0]=t;
else
{
strncpy(string,s,i)
string[i]=t;
string[i+1]='\0';
strcat(string,t);
strcat(string,(s+i));
strcpy(s,string);
}
}
我有三个地方不懂1.这句!strlen(s)是什么意思。
2.string[i]=t;
string[i+1]='\0';
strcat(string,t);
不是已经将t和\0赋给srting吗,为什么还要用strcat。
3. strcat(string,(s+i))我知道是将s剩余的字符连接到string,但为什么是用s+i。
麻烦大神帮我解答

直接看代码:

#include<stdio.h>
#include<string.h>
void main()
{
char str[100],str_new[100],t;
char *p=str;
int at=0;
puts("输入字符串:");
gets(str);
puts("要插入的字符:");
t=getchar();/*.输入的字符被存放在键盘缓冲区中.直到按回车为止(回车字符也放在缓冲区中);其他字符会保留在键盘缓存区中,等待后续getchar调用读取*/
fflush(stdin);//刷输入新缓存区的内容
puts("插入的位置:");
scanf("%d",&at);
if(at>strlen(str))
{ puts("输入长度应该小于字符串长度!");
return;
}
int j=0;
for(int i=0;str[i]!=0;i++)//新的字符串在这个for()生成
{
if(i==at-1)
str_new[j++]=t;
str_new[j++]=str[i];

}
str_new[j]='\0'; 
    puts(str_new);


}

这里使用生成新数组的for循环较简洁,但是要新定义一个数组,有一定的系统开销,读者也可以用其它的方法。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-01

1    strlen是C库函数,需要包含头文件<string.h>,作用是求一个字符串的大小,返回值为无符号整数。比如一个字符串strlen(“hello”),那么返回5。在C中,0表示假,其他任何数表示真,!expr表示这个表达式为假,即strlen(s)返回值为0。if(!strlen(s))即如果字符串为空串

2、3    insert函数采用的算法是,如果需要插入的字符串是空串,那么直接赋值即可;否则,先将需要插入的字符串的前面部分复制到新字符串中(strncpy(string,s,i)
),插入字符到新字符串(string[i]=t ; string[i+1]='\0';),再将后面部分附加到新字符串(strcat(string,(s+i)); //i是s字符串偏移)


你这份代码有相当多的错误,附一份修改后的,insert2为insert的另一个简短版本

#include<stdio.h>
#include<string.h>
void insert(char s[],char t,int i);
void insert2(char s[],char t,int i);
int main()
{
char str1[100],c;
int position;
printf("please input string:\n");
gets(str1);
printf("piease input a char:\n");
scanf("%c",&c);
printf("please input position:\n");
scanf("%d",&position);
insert(str1,c,position);
puts(str1);
}

void insert(char s[],char t,int i)
{
char string[100];
if(!strlen(s))
{
string[0]=t;
string[1]='\0' ;
}
else
{
strncpy(string,s,i) ;
string[i]=t;
string[i+1]='\0';
strcat(string,(s+i));
}
strcpy(s,string);
}

void insert2(char s[],char t,int i)
{
int j = strlen (s) ;
while (j >= i)
s[j+1] = s[j--] ;    //从第i个字符往后移动一个位置。如s="abc" i=0,移动后s="aabc"
s[i] = t ;
}

追问

请问那个简短版本insert2中 s[j+1] = s[j--],我不太理解。用你举的例子s=abc,j=3,也就是s[4]=s[2],那就只有2对应的字符移到4的位置,那其他字符没有移动啊。望大神帮我解释一下。

追答

这是个while循环,当j大于等于i的时候,便一直循环
j--是在运算之后再减1
"abc\0"
s[4] = s[3] //"abc\0\0"
s[3] = s[2] //"abcc\0"
s[2] = s[1] //"abbc\0"
s[1] = s[0] //"aabc\n"
再插入到第0个位置
s[0] = x

本回答被提问者和网友采纳
第2个回答  2020-10-07
程序我加了一下,这样输入的字符那里都能插了
#include<stdio.h>
#include<string.h>
void main()
{
char str[100],str_new[100],c[10];
char t;
//char*p;
int at=0;
int i=0,j=0;
puts("输入字符串:");
gets(str);
puts("要插入的字符:");
t=getchar();
puts("插入的位置:");
scanf("%d",&at);

if(at>strlen(str))
{
puts("输入长度大于字符串长度放在最后面!");
c[0]=t;
c[1]='\0';
printf("%s",strcat(str,c));
printf("\n");
return;
}

//新的字符串在这个for()生成
//数组不初始化,其元素默认为0;
for(i=0;str[i]!='\0';i++)
{
if(i==at-1)
str_new[j++]=t;
str_new[j++]=str[i];

}
str_new[j]='\0';
puts(str_new);
printf("\n");

}