来活了!求优化一下,也可以多加一些关于字符串处理的函数(最好利用指针).


#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. 字符串比较函数:比较两个字符串是否相同,输出相同返回真,否则返回假。

  2. 字符串查找函数:在一个字符串中查找某个子串,并返回其位置,如果不存在则返回-1。

  3. 字符串替换函数:在一个字符串中将某个子串替换为另一个子串。

以上三个函数都可以利用指针实现,可以更高效地处理字符串。

另外,建议在输入用户名密码时使用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");
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7598135
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:利用指针编写程序实现在一个字符串的隨意位置上插入一个字符(要求插入字符的位置由用户从键盘输入)。
  • 除此之外, 这篇博客: 一元多项式的表示、相加与相乘 -数据结构课程设计中的 先看效果图 最终的效果!!! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 当然输出板的颜色做了些许调整,调回黑白很简单!!!

  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 采用更进取的设计策略,打造工作流引擎!小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    关于优化字符串处理速度的方法和利用指针进行字符串处理的建议,可以采用以下方法:

    1. 使用标准库函数:直接调用C语言中已经实现好的字符串处理库函数,如strlen、strcpy、strcat、strcmp等,这些函数内部都使用了一些高效的算法和指针运算,可以大大提高字符串处理的速度。

    2. 预先计算字符串长度:在需要重复读取同一个字符串时,可以考虑预先计算字符串长度,并将长度存储在一个变量中,这样可以避免重复计算,提高efficiency。

    3. 避免不必要的内存分配和拷贝:对于常量字符串和固定长度的字符串,可以使用字符数组来代替字符串指针,避免内存分配和拷贝的开销。

    4. 利用指针进行字符串处理:针对字符串复制、连接、查找和替换等常见操作,可以使用指针运算实现,可以显著提高效率。比如,可以使用strcpy和strcat函数来实现字符串复制和连接,使用strstr函数来实现字符串查找,使用指针遍历来实现字符串替换等等。

    综上所述,针对不同的字符串处理需求,可以采用不同的优化方法和指针技巧来提高字符串处理速度和效率。

还有没有回答啦,大佬们