#include<stdio.h>
#define STRINGMAX 100
typedef struct
{
char vec[STRINGMAX];
int len;
}str;
int LenStr(str *r)
{
int i=0;
while(r->vec[i]!='\0')
i++;
return i;
}
str *CreateStr(str *r)
{
gets(r->vec);
r->len=LenStr(r);
return r;
}
void ConcatStr(str *r1,str *r2)
{
int i;
printf("r1=%s,r2=%s\n",r1->vec,r2->vec);
if(r1->len+r2->len>STRINGMAX)
printf("两个串太长,溢出!\n");
else
{
for(i=0;i<r2->len;i++)
r1->vec[r1->len+i]=r2->vec[i];
r1->vec[r1->len+i]='\0';
r1->len=r1->len+r2->len;
}
}
void InsStr(str *r,str *r1,int i)
{
int k;
if(i>r->len+2||r->len+r1->len>STRINGMAX)
printf("不能插入\n!");
else
{
for(k=r->len-1;k>=i-1;k--)
r->vec[r1->len+k]=r->vec[k];
for(k=0;k<=r1->len;k++)
r->vec[i-1+k]=r1->vec[k];
r->len=r->len+r1->len;
}
}
void DelStr(str *r,int i,int j)
{
int k;
if(i+j-1>r->len)
printf("!\n");
else
{
for(k=i+j-1;k<=r->len;k++,i++)
r->vec[i-1]=r->vec[k];
r->len=r->len-j;
}
}
void main()
{
str a,b,c,d;
str *r=&a,*r1;
char choice,p;
int i,j,ch=1,k;
r->vec[0]='\0';
while(ch!=0)
{
printf("\n 串子系统 ");
printf("\n***********************************************");
printf("\n* 1-------创 建 字 串 *");
printf("\n* 2-------连 接 字 串 *");
printf("\n* 3-------插 入 子 串 *");
printf("\n* 4-------删 除 子 串 *");
printf("\n* 5-------显 示 字 串 *");
printf("\n* 0-------返 回 *");
printf("\n***********************************************");
printf("\n请选择菜单号(0—8):");
scanf("%c",&choice);
getchar();
if(choice=='1')
{
printf("\n请输入一个字符串:");
CreateStr(r);
}
else
if(choice=='2')
{
printf("\n请输入所要连接的串:");
r1=CreateStr(&b);
ConcatStr(r,r1);
printf("\n连接以后的新串值为:");
puts(r->vec);
}
else
if(choice=='3')
{
printf("\n请输入在第几个字符前插入:");
scanf("%d",&i);
getchar();
printf("\n请输入所要插入的字符串:");
r1=CreateStr(&b);
InsStr(r,r1,i);
}
else
if(choice=='4')
{
printf("\n请输入从第几个字符开始:");
scanf("%d",&i);
getchar();
printf("\n请输入删除的连续字符数:");
scanf("%d",&j);
getchar();
DelStr(r,i,j);
}
else
if(choice=='5')
{
printf("\n该串值为:");
if(r->vec[0]=='\0')
printf("空!\n");
else
puts(r->vec);
}
else
if(choice=='0')
ch=0;
}
}
基于new bing加以修改过后的回答:
#include<stdio.h>
#define STRINGMAX 100
typedef struct
{
char vec[STRINGMAX];
int len;
}str;
int LenStr(str *r)
{
int i=0;
while(r->vec[i]!='\0')
i++;
return i;
}
str *CreateStr(str *r)
{
gets(r->vec);
r->len=LenStr(r);
return r;
}
void ConcatStr(str *r1,str *r2)
{
int i;
printf("r1=%s,r2=%s\n",r1->vec,r2->vec);
if(r1->len+r2->len>STRINGMAX)
printf("两个串太长,溢出!\n");
else
{
for(i=0;i<r2->len;i++)
r1->vec[r1->len+i]=r2->vec[i];
r1->vec[r1->len+i]='\0';
r1->len=r1->len+r2->len;
}
}
void InsStr(str *r, str *r1, int i)
{
int k;
if (i > r->len + 2 || r->len + r1->len > STRINGMAX)
printf("不能插入!\n");
else
{
for (k = r->len - 1; k >= i - 1; k--)
{
if (k + r1->len < STRINGMAX - 1)
r->vec[k + r1->len] = r->vec[k];
}
for (k = 0; k < r1->len; k++)
{
if (i - 1 + k < STRINGMAX - 1)
r->vec[i - 1 + k] = r1->vec[k];
}
r->len = r->len + r1->len;
}
}
void DelStr(str *r, int i, int j)
{
int k;
if (i + j - 1 > r->len)
printf("不能删除!\n");
else
{
for (k = i + j - 1; k <= r->len; ++k)
r->vec[k - j] = r->vec[k];
r->len = r->len - j;
r->vec[r->len] = '\0'; // 添加结束符
}
}
void main()
{
str a,b,c,d;
str *r=&a,*r1;
char choice,p;
int i,j,ch=1,k;
r->vec[0]='\0';
while(ch!=0)
{
printf("\n 串子系统 ");
printf("\n***********************************************");
printf("\n* 1-------创 建 字 串 *");
printf("\n* 2-------连 接 字 串 *");
printf("\n* 3-------插 入 子 串 *");
printf("\n* 4-------删 除 子 串 *");
printf("\n* 5-------显 示 字 串 *");
printf("\n* 0-------返 回 *");
printf("\n***********************************************");
printf("\n请选择菜单号(0—8):");
scanf("%c",&choice);
getchar();
if(choice=='1')
{
printf("\n请输入一个字符串:");
CreateStr(r);
}
else
if(choice=='2')
{
printf("\n请输入所要连接的串:");
r1=CreateStr(&b);
ConcatStr(r,r1);
printf("\n连接以后的新串值为:");
puts(r->vec);
}
else
if(choice=='3')
{
printf("\n请输入在第几个字符前插入:");
scanf("%d",&i);
getchar();
printf("\n请输入所要插入的字符串:");
r1=CreateStr(&b);
InsStr(r,r1,i);
}
else
if(choice=='4')
{
printf("\n请输入从第几个字符开始:");
scanf("%d",&i);
getchar();
printf("\n请输入删除的连续字符数:");
scanf("%d",&j);
getchar();
DelStr(r,i,j);
}
else
if(choice=='5')
{
printf("\n该串值为:");
if(r->vec[0]=='\0')
printf("空!\n");
else
puts(r->vec);
}
else
if(choice=='0')
ch=0;
}
}
引用chatGPT作答,这段C语言代码的问题可能有以下几个:
1.gets()函数存在缺陷和安全隐患,容易导致缓冲区溢出攻击,应该避免使用。可以使用fgets()函数代替,限制输入长度并防止缓冲区溢出。
2.DelStr()函数中的循环条件可能存在问题,如果i+j-1等于r->len,则循环条件成立,但是r->vec[i+j-1]越界了。
3.InsStr()函数中的第一个循环条件应该是i>r->len,而不是i>r->len+2,因为字符数组的下标是从0开始的。
4.在main()函数中,第一次输入菜单号时,会多读入一个换行符,导致后面的输入函数无法读入正确的输入值。可以使用getchar()函数来读取多余的换行符。
不知道你这个问题是否已经解决, 如果还没有解决的话:#include "stdio.h"
#include "string.h"
#define max 100
void main(){
char a[max];
char b[max][max];
gets(a);
int k=0,i,j,flag;
for(i=0;i<strlen(a);i++){
flag = 1;
//每一字符扫描二维数组,看是否已经存入相同的字符
for(j=0;j<=k;j++)
//如果已经存入,则继续在后面添加
if(a[i]==b[j][0]){
b[j][strlen(b[j])] = a[i];
flag =0;
break;
}
//否则新存入这个字符,k代表已经存入的字符串个数
if(flag) b[k++][0] = a[i];
}
for(i=0;i<k;i++){
printf("%c,%d\n",b[i][0],strlen(b[i]));
}
}