#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int SIZE=20;
const char name[] = { "奥特曼" };
const char code[] = { "1234" };
void Addarr(char *a,char b,int c);
char *Delarr(char *a,char b);
char Sumarr(char *a);
int Huiarr(char *a);
void Backarr(char *a);
void Backarr(char *a);
void Menu();
int main()
{
char a[SIZE];
char *str1;
char*arr=a;
char b,out;
int c=0,sum=0;
int len=strlen(a);
char arr1[10] = {};
char arr2[20] = {};
char arr3[20];
char *str=arr3;
int i,t=1,index;
printf("请输入用户名和密码:\n");
for (i = 0; i < 3; i++)
{
printf("请输入用户名:\n");
gets(arr1);
printf("请输入密码:\n");
gets(arr2);
if ((strcmp(arr1, name) || strcmp(arr2, code)) == 0)
{
printf("登陆成功!!!\n");
printf("*************\n");
printf("请输入字符串:\n");
gets(arr);
break;
}
else
printf("重新输入:\n");
}
if (i == 3)
printf("退出系统");
system("pause");
while(t)
{
Menu();
printf("请输入你要使用的功能号:\n");
scanf("%d",&index);
switch(index)
{
case 1:
printf("请输入要删除的元素:\n");
scanf("%s",&out);
getchar();
str1=Delarr(a,out);
printf("删除后的字符串为:\n");
puts(str1);
break;
case 2:
printf("请输入插入元素和位置:\n");
scanf("%c,%d",&b,&c);
if(c < 0 || c > len)
printf("超出范围!!!\n");
else
{
Addarr(arr,b,c);
printf("插入后的字符串为:%s\n",arr);
}
break;
case 3:
sum=Sumarr(arr);
printf("字符串长度为:%d\n",sum);
break;
case 4:
if(Huiarr(arr)==1)
printf("是回文串\n");
else
printf("不是回文串\n");
break;
case 5:
Backarr(arr);
printf("你要逆置的字符串为:%s\n",arr);
break;
case 6:
printf("请输入你要连接的字符串:\n");
scanf("%s",str);
strcat(arr,str);
printf("连接后的字符串为:%s\n",arr);
break;
case 7:
printf("即将退出系统!!!\n");
system("pause");
t=0;
break;
default:
printf("输入错误,重新输入!!\n");
}
}
return 0;
}
void Addarr(char *a,char b,int c)
{
int i;
int j=strlen(a);
for(i=j;i>=c;i--)
a[i+1]=a[i];
a[c]=b;
}
char *Delarr(char *a,char b)
{
int i,j=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]!=b)
{
a[j++]=a[i];
}
}
a[j]='\0';
return a;
}
char Sumarr(char *a)
{
int i;
for(i=0;a[i]!='\0';i++);
return i;
}
int Huiarr(char *a)
{
int len=strlen(a);
int i;
for(i=0;i<len/2;i++)
{
if(a[i]!=a[len-1-i])
return 0;
}
return 1;
}
void Backarr(char *a)
{
int len=strlen(a);
int i;
char t;
for(i=0;i<len/2;i++)
{
t=a[i];
a[i]=a[len-1-i];
a[len-i-1]=t;
}
}
void Menu()
{
printf("***************************\n");
printf("*****欢迎进入系统!!!*******\n");
printf("****1.字符串删减***********\n");
printf("****2.字符串增添***********\n");
printf("****3.字符串各元素统计个数*\n");
printf("****4.判断回文串***********\n");
printf("****5.逆置*****************\n");
printf("****6.字符串连接***********\n");
printf("****7.退出系统*************\n");
printf("***************************\n");
printf("***************************\n");
}
参考GPT和自己的思路:好的,我会尽力回答你的问题。根据你给出的代码,我看到你已经定义了一些字符串处理的函数,如增删查改等。如果你要优化这个代码,可以考虑改进这些函数的实现方式,使其更高效、更易读。此外,你还可以添加一些新的字符串处理函数,例如:
字符串比较函数:比较两个字符串是否相同,输出相同返回真,否则返回假。
字符串查找函数:在一个字符串中查找某个子串,并返回其位置,如果不存在则返回-1。
字符串替换函数:在一个字符串中将某个子串替换为另一个子串。
以上三个函数都可以利用指针实现,可以更高效地处理字符串。
另外,建议在输入用户名密码时使用fgets函数代替gets函数,以避免缓冲区溢出的问题。也可以在选择功能号时,添加输入限制,如只允许输入数字等,以提高程序的健壮性。
参考ChatGPT部分内容:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int SIZE=20;
const char name[] = { "奥特曼" };
const char code[] = { "1234" };
void add_char(char *str, char c, int pos);
char *delete_char(char *str, char c);
int count_chars(char *str, char c);
int is_palindrome(char *str);
void reverse_string(char *str);
void concatenate_strings(char *str1, char *str2);
void menu();
int main()
{
char str[SIZE];
char *str_ptr = str;
char c, out;
int pos, sum = 0;
int len = strlen(str);
char str1[10] = {};
char str2[20] = {};
char str3[20];
char *str3_ptr = str3;
int i, t = 1, index;
printf("请输入用户名和密码:\n");
for (i = 0; i < 3; i++)
{
printf("请输入用户名:\n");
gets(str1);
printf("请输入密码:\n");
gets(str2);
if ((strcmp(str1, name) || strcmp(str2, code)) == 0)
{
printf("登陆成功!!!\n");
printf("*************\n");
printf("请输入字符串:\n");
gets(str);
break;
}
else
printf("重新输入:\n");
}
if (i == 3)
printf("退出系统");
system("pause");
while(t)
{
menu();
printf("请输入你要使用的功能号:\n");
scanf("%d",&index);
switch(index)
{
case 1:
printf("请输入要删除的元素:\n");
scanf("%s",&out);
getchar();
str_ptr = delete_char(str, out);
printf("删除后的字符串为:\n");
puts(str_ptr);
break;
case 2:
printf("请输入插入元素和位置:\n");
scanf("%c,%d",&c,&pos);
if(pos < 0 || pos > len)
printf("超出范围!!!\n");
else
{
add_char(str_ptr, c, pos);
printf("插入后的字符串为:%s\n",str_ptr);
}
break;
case 3:
printf("请输入要统计的元素:\n");
scanf("%s",&c);
getchar();
sum = count_chars(str, c);
printf("元素 %c 在字符串中出现的次数为:%d\n", c, sum);
break;
case 4:
if(is_palindrome(str_ptr) == 1)
printf("是回文串\n");
else
printf("不是回文串\n");
break;
case 5:
reverse_string(str_ptr);
printf("逆置后的字符串为:%s\n",str_ptr);
break;
case 6:
printf("请输入你要连接的字符串:\n");
scanf("%s",str3_ptr);
concatenate_strings(str_ptr, str3_ptr);
printf("连接后的字符串为:%s\n",str_ptr);
break;
case 7:
printf("即将退出系统!!!\n");
system("pause");
t=0;
break;
default:
printf("输入错误,重新输入!!\n");
}
}
return 0;
}
void add_char(char *str, char c, int pos)
{
int i;
int len = strlen(str);
for(i = len; i >= pos; i--)
str[i+1] = str[i];
str[pos] = c;
}
char *delete_char(char *str, char c)
{
int i, j = 0;
for(i = 0; str[i] != '\0'; i++)
{
if(str[i] != c)
{
str[j++] = str[i];
}
}
str[j] = '\0';
return str;
}
int count_chars(char *str, char c)
{
int i, count = 0;
for(i = 0; str[i] != '\0'; i++)
{
if(str[i] == c)
{
count++;
}
}
return count;
}
int is_palindrome(char *str)
{
int len = strlen(str);
int i;
for(i = 0; i < len/2; i++)
{
if(str[i] != str[len-1-i])
return 0;
}
return 1;
}
void reverse_string(char *str)
{
int len = strlen(str);
int i;
char temp;
for(i = 0; i < len/2; i++)
{
temp = str[i];
str[i] = str[len-1-i];
str[len-i-1] = temp;
}
}
void concatenate_strings(char *str1, char *str2)
{
strcat(str1, str2);
}
void menu()
{
printf("***************************\n");
printf("*****欢迎进入系统!!!*******\n");
printf("****1.字符串删减***********\n");
printf("****2.字符串增添***********\n");
printf("****3.字符串各元素统计个数*\n");
printf("****4.判断回文串***********\n");
printf("****5.逆置*****************\n");
printf("****6.字符串连接***********\n");
printf("****7.退出系统*************\n");
printf("***************************\n");
printf("***************************\n");
}
当然输出板的颜色做了些许调整,调回黑白很简单!!!
关于优化字符串处理速度的方法和利用指针进行字符串处理的建议,可以采用以下方法:
使用标准库函数:直接调用C语言中已经实现好的字符串处理库函数,如strlen、strcpy、strcat、strcmp等,这些函数内部都使用了一些高效的算法和指针运算,可以大大提高字符串处理的速度。
预先计算字符串长度:在需要重复读取同一个字符串时,可以考虑预先计算字符串长度,并将长度存储在一个变量中,这样可以避免重复计算,提高efficiency。
避免不必要的内存分配和拷贝:对于常量字符串和固定长度的字符串,可以使用字符数组来代替字符串指针,避免内存分配和拷贝的开销。
利用指针进行字符串处理:针对字符串复制、连接、查找和替换等常见操作,可以使用指针运算实现,可以显著提高效率。比如,可以使用strcpy和strcat函数来实现字符串复制和连接,使用strstr函数来实现字符串查找,使用指针遍历来实现字符串替换等等。
综上所述,针对不同的字符串处理需求,可以采用不同的优化方法和指针技巧来提高字符串处理速度和效率。
还有没有回答啦,大佬们