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