c primmer Plus第六版第十一章编程练习第11题

本文介绍了一个使用C语言实现的字符串操作程序,包括按ASCII顺序、长度和首单词长度排序字符串列表的功能。通过用户输入,程序展示了不同排序方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <string.h>
#include <ctype.h>
void put_string(char **st,int n); //打印字符串列表
void ascii_s(char **st,int n); //ASCII顺序打印字符串列表
void long_put(char **st,int n); //按长度递增排序
int fast_words(char *st);//字符串首单词
void fast_words_put(char **st,int n); //按首单词长短排序
#define SIZE 81 //字符串长度 包括\0
#define LIM 10 //可读入的最多行数
char *s_gets(char *st,int n); //输入字符串
int main(void)
{
char input[LIM][SIZE];
char *ptstr[LIM];
int ct = 0;
char ch;
puts(“请输入10组字符串:”);
while(ct<LIM&&s_gets(input[ct],SIZE)!=NULL&&input[ct][0]!=’\0’) //字符串数组赋值,循环条件是数组首字符不是空字符
{
ptstr[ct]=input[ct];
ct++;
}
puts(“a.打印源字符串列表。 b.以ASCII中的顺序打印字符串。”);
puts(“c.按长度递增打印字符串。 d.按字符串中第一个单词长度打印字符串。”);
puts(“e.退出。”);

while((ch=getchar())!='e') //e退出
{
if('\n'==ch)
        continue;
if(ch<'a'||ch>'e') //不再选项内重新输入
    {
        puts("请重新输入正确的选择:");
        ch=getchar();
    }
if(islower(ch))
        switch(ch)
    {
        case 'a':
            put_string(ptstr,LIM);
            break;
        case 'b':
            ascii_s(ptstr,LIM);
            break;
        case 'c':
            long_put(ptstr,LIM);
            break;
        case 'd':
            fast_words_put(ptstr,LIM);
            break;
    }
    puts("a.打印源字符串列表。                 b.以ASCII中的顺序打印字符串。");
    puts("c.按长度递增打印字符串。              d.按字符串中第一个单词长度打印字符串。");
    puts("e.退出。");
    
    continue;
}

puts(“Bye!”);

return 0;

}
void put_string(char **st,int n)
{
int i;
for(i=0;i<n;i++)
puts(st[i]);
}

char *s_gets(char * st, int n)
{
char * ret_val;
int i = 0;

ret_val = fgets(st,n,stdin);
if (ret_val)
{
    while(st[i] != '\n' && st[i] != '\0')
        i++;
    if (st[i] == '\n')
        st[i] = '\0';
    else
        while(getchar() != '\n');
}

return ret_val;

}
void ascii_s(char **st,int n)
{
int i,j;
char *temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{ //字符串排序,最大的排最后
if(strcmp(st[j],st[j+1])>0)//temp记录最大的字符串并把它排在最后
{
temp=st[j];
st[j]=st[j+1];
st[j+1]=temp;
}
}
}
put_string(st,n);
}

void long_put(char **st,int n)
{
int i,j;
char *temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(strlen(st[j])>=strlen(st[j+1])) //字符串最长的放最后
{
temp=st[j];
st[j]=st[j+1];
st[j+1]=temp;
}
}
}
put_string(st,n); //打印结果
}

int fast_words(char *st)
{
int i;

for(;!isalpha(*st);st++)  //略过数组开头的非字母字符
    if(*st=='\0') return 0; //如果是空字符 返回0.
for(i=0;isalpha(st[i]);i++) //循环计量首字母长度
        continue;
return i+1;     //由于字母长度计量变量i是从0开始计数,所以加1

}

void fast_words_put(char **st,int n)
{
int i,j;
char *temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(fast_words(st[j])>fast_words(st[j+1]))
{
temp=st[j];
st[j]=st[j+1];
st[j+1]=temp;
}
}
}
put_string(st,n);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值