C语言字符串的处理问题

经过我的思考,我的问题是:
设有若干个字符串,这些字符串存储位置的首地址保存在指针数组中。
实现字符串的输入和输出; 对所有的字符串按从小到大的顺序排序,即指针数组中的第一个元素指向最小的字符串,第二个元素指向次小的字符串…,依次类推; 判断这些字符串中是否有“回文”,所谓“回文”指的是顺读和倒读都是一样的字符串;我想 设计一个菜单,具有上述规定的操作要求、退出系统等最基本的功能。

不就是char类型的二维数组么

#include <stdio.h>
#include <string.h>
void menu()
{
    printf("        1、添加字符串\n");
    printf("        2、字符串排序\n");
    printf("        3、显示回文串\n");
    printf("        0、退出程序\n\n");
    printf(" 输入您的选择:");
}

int addStr(char str[][100],int n)
{
    printf("请输入新字符串:");
    gets(str[n]);
    return 1;
}

void sort(char str[][100],int n)
{
    int i,j;
    char s[100];
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
            if(strcmp(str[j],str[j+1]) > 0)
            {
                strcpy(s,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],s);
            }
        }
}

void print(char str[][100],int n)
{
    for(int i=0;i<n;i++)
        puts(str[i]);
}

void hw(char str[][100],int n)
{
    for(int i=0;i<n;i++)
    {
        int len = strlen(str[i]);
        int p=0,q=len-1;
        while(p<q)
        {
            if(str[i][p] != str[i][q])
                break;
            p++;
            q--;
        }
        if(p>=q)
            puts(str[i]);
    }
}

int main()
{
    char str[100][100];
    int n=0,sel=0;
    while(1)
    {
        system("cls");
        menu();
        scanf("%d",&sel);
        getchar();
        switch(sel)
        {
        case 1:
            if(addStr(str,n)==1)
                n++;
            break;
        case 2:
            sort(str,n);
            print(str,n);
            break;
        case 3:
            hw(str,n);
            break;
        case 0:
            return 0;
            break;
        default:
            printf("输入错误");
            break;
        }
        printf("是否继续(1表示继续,其它退出):");
        scanf("%d",&sel);
        getchar();
        if(sel != 1)
            break;
    }
    return 0;
}
 

这个还是很简单的
-获取每个字符串的第一个字符,然后把这些字符排序,然后整个字符串就按照顺序排列完成。
判断是否为回文:判断字符串的第一个字符是否与最后一个字符相等,第二个字符与倒数第二个字符是否相等,依次类推,若全部相等,则是回文
方法2:将该字符串反序排列,即第一个字符变成最后一个字符,第二个字符变为倒数第二个字符,。。。最后判断该字符串是否与原先的字符串相等

ChatGPT尝试为您解答,仅供参考

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STRINGS 10
#define MAX_LENGTH 50

// 字符串结构体,用于存储字符串和其长度
typedef struct {
    char str[MAX_LENGTH];
    int length;
} String;

// 字符串输入函数
void inputStrings(String* strings, int* n) {
    printf("请输入字符串的个数(最多 %d 个):", MAX_STRINGS);
    scanf("%d", n);
    getchar(); // 消耗回车符

    for (int i = 0; i < *n; i++) {
        printf("请输入第 %d 个字符串:", i + 1);
        fgets(strings[i].str, MAX_LENGTH, stdin);
        strings[i].length = strlen(strings[i].str) - 1; // 去掉末尾的换行符
    }
}

// 字符串输出函数
void outputStrings(String* strings, int n) {
    for (int i = 0; i < n; i++) {
        printf("第 %d 个字符串是:%s\n", i + 1, strings[i].str);
    }
}

// 字符串排序函数(冒泡排序)
void sortStrings(String* strings, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (strcmp(strings[j].str, strings[j + 1].str) > 0) {
                String temp = strings[j];
                strings[j] = strings[j + 1];
                strings[j + 1] = temp;
            }
        }
    }
}

// 判断字符串是否为回文函数
int isPalindrome(String string) {
    int n = string.length;
    for (int i = 0; i < n / 2; i++) {
        if (string.str[i] != string.str[n - 1 - i]) {
            return 0; // 不是回文
        }
    }
    return 1; // 是回文
}

int main() {
    String strings [MAX_STRINGS]; // 字符串数组
int n; // 字符串个数

int choice;
do {
    printf("\n");
    printf("1. 输入字符串\n");
    printf("2. 输出字符串\n");
    printf("3. 排序字符串\n");
    printf("4. 判断字符串是否为回文\n");
    printf("5. 退出系统\n");
    printf("请输入要执行的操作的编号:");
    scanf("%d", &choice);
    getchar(); // 消耗回车符

    switch (choice) {
        case 1:
            inputStrings(strings, &n);
            break;
        case 2:
            outputStrings(strings, n);
            break;
        case 3:
            sortStrings(strings, n);
            break;
        case 4:
            for (int i = 0; i < n; i++) {
                if (isPalindrome(strings[i])) {
                    printf("字符串 %s 是回文\n", strings[i].str);
                } else {
                    printf("字符串 %s 不是回文\n", strings[i].str);
                }
            }
            break;
        case 5:
            printf("退出系统\n");
            break;
        default:
            printf("输入的编号无效\n");
            break;
    }
} while (choice != 5);

return 0;
}

参考代码:

#include <stdio.h>
#include <string.h>
int huiwen(const char* pstr[5]);
void menue();
int input(char *q[5]);
void sort(char *str[5]);
#define n 5
int main()
{
    int i,num,b,g;
    char a[n][10];
    char *p[n];
    for (i=0;i<n;i++)
    {
        p[i]=a[i];
    }
    for (g=1;g!=0;)
    {
        menue();
        scanf("%d",&num);
        switch(num)
        {
        case 1:
            b=input(p);
            break;
        case 2:
            sort(p);
            break;
        case 3:
            huiwen(p);
            if (!huiwen(p[i])) puts(p[i]);
        break;
            break;
        case '4':
            getchar();
            g = 0;
            printf("感谢使用!!\n");
            break;
        default:
            getchar();
            printf("输入错误,请重新输入\n");
            printf("\n");
            printf("\n");
        }
    }
    
}
void menue()
{
    printf("*******欢迎使用********");
    printf("===============================================================================\n");
    printf("                  1.输入与输出   (每个字符串不超过100个字符,最多5个字符串) \n");
    printf("                  2.从小到大排序\n");
    printf("                  3.判断是否有回文\n");
    printf("                  4.关闭程序\n");
    printf("===============================================================================\n");
    printf("\n");
    printf("   请输入你需要的操作 : ");
}
 
int input(char *q[])
{
    int s,z,x,c,m,b;
    static int j=0;
    printf("\n");
    printf("     1.输入\n");
    printf("     2.修改\n");
    printf("     3.输出\n\n");
    printf("     4.返回主菜单\n");
    scanf("%d",&s);
    switch(s)
    {
    case 1:
        printf("输入串数");
        scanf("%d",&z);
        if(z>5)
        {
            printf("输入数大于可输入串数");
        }
        for (c=0;c<=z-1;c++)
        {
            printf("输入的第%d串数是",j+1);
            scanf("%s",q[c]);
            j++;
            if((j+z)>5)
            {
                printf("输入的串数大于可输入的串数");
            }
        }
        break;
    case 2:
        printf("输入你所想修改的串数");
        scanf("%d",&x);
        printf("请输入修改内容: ");
        scanf("%s",q[x-1]);
        printf("\n修改成功!\n\n\n");
        getchar();
        break;
    case 3:
        getchar();
        for(c=0;m<j;c++){
            printf("第%d个字符串是: %s\n",c+1,q[c]);
        }
        break;
    case 4:
        getchar();
        break;
    default:
        printf("输入错误\n\n\n\n");
    }
    return b;
}
void sort(char *str[n])
{
    int i,j;
    char *t;
    for (i=0;i<n-1;i++)
    {
        for (j=1;j<n;j++)
        {
            if(strcmp(str[i],str[j])>0)
            {
                t = str[i];
                str[i] = str[j];
                str[j] = t;
            }
        }
    }
    printf("已排好序");
    for(i=0;i<n;i++)
    {
        printf("%s",str[i]);
    }
}
int huiwen( char* pstr)
{
    int i,j;
    for (j=0;j<5;j++)
    {
        int len = strlen(pstr[i]);
        for (i = 0; i < len / 2; i++)
        {
            if (pstr[i] != pstr[len - 1 - i])    
            {
                return 1;
            }
        }
    }
        return 0;
}

先获取输入字符串,排序,检查是否回文,输出,可以参考https://blog.csdn.net/qq_61768843/article/details/121325342

#include <stdio.h>
#include <string.h>
int huiwen(const char* pstr[5]);
void menue();
int input(char *q[5]);
void sort(char *str[5]);
#define n 5
int main()
{
    int i,num,b,g;
    char a[n][10];
    char *p[n];
    for (i=0;i<n;i++)
    {
        p[i]=a[i];
    }
    for (g=1;g!=0;)
    {
        menue();
        scanf("%d",&num);
        switch(num)
        {
        case 1:
            b=input(p);
            break;
        case 2:
            sort(p);
            break;
        case 3:
            huiwen(p);
            if (!huiwen(p[i])) puts(p[i]);
        break;
            break;
        case '4':
            getchar();
            g = 0;
            printf("感谢使用!!\n");
            break;
        default:
            getchar();
            printf("输入错误,请重新输入\n");
            printf("\n");
            printf("\n");
        }
    }
}
void menue()
{
    printf("*******欢迎使用********");
    printf("===============================================================================\n");
    printf("                  1.输入与输出   (每个字符串不超过100个字符,最多5个字符串) \n");
    printf("                  2.从小到大排序\n");
    printf("                  3.判断是否有回文\n");
    printf("                  4.关闭程序\n");
    printf("===============================================================================\n");
    printf("\n");
    printf("   请输入你需要的操作 : ");
}
int input(char *q[])
{
    int s,z,x,c,m,b;
    static int j=0;
    printf("\n");
    printf("     1.输入\n");
    printf("     2.修改\n");
    printf("     3.输出\n\n");
    printf("     4.返回主菜单\n");
    scanf("%d",&s);
    switch(s)
    {
    case 1:
        printf("输入串数");
        scanf("%d",&z);
        if(z>5)
        {
            printf("输入数大于可输入串数");
        }
        for (c=0;c<=z-1;c++)
        {
            printf("输入的第%d串数是",j+1);
            scanf("%s",q[c]);
            j++;
            if((j+z)>5)
            {
                printf("输入的串数大于可输入的串数");
            }
        }
        break;
    case 2:
        printf("输入你所想修改的串数");
        scanf("%d",&x);
        printf("请输入修改内容: ");
        scanf("%s",q[x-1]);
        printf("\n修改成功!\n\n\n");
        getchar();
        break;
    case 3:
        getchar();
        for(c=0;m<j;c++){
            printf("第%d个字符串是: %s\n",c+1,q[c]);
        }
        break;
    case 4:
        getchar();
        break;
    default:
        printf("输入错误\n\n\n\n");
    }
    return b;
}
void sort(char *str[n])
{
    int i,j;
    char *t;
    for (i=0;i<n-1;i++)
    {
        for (j=1;j<n;j++)
        {
            if(strcmp(str[i],str[j])>0)
            {
                t = str[i];
                str[i] = str[j];
                str[j] = t;
            }
        }
    }
    printf("已排好序");
    for(i=0;i<n;i++)
    {
        printf("%s",str[i]);
    }
}
int huiwen( char* pstr)
{
    int i,j;
    for (j=0;j<5;j++)
    {
        int len = strlen(pstr[i]);
        for (i = 0; i < len / 2; i++)
        {
            if (pstr[i] != pstr[len - 1 - i])    
            {
                return 1;
            }
        }
    }
        return 0;
}