编写程序实现对输入的字符串排序(可以规定比较的字符)

发布者:忙中取乐最新更新时间:2016-03-08 来源: eefocus关键字:字符串  数字排序  编写程序 手机看文章 扫描二维码
随时随地手机看文章
一. 程序功能
编写程序实现对输入的字符串排序, 如果主函数传递了-n参数, 则按数字排序,否则按字符串排序.
同时,如果传递了-r参数,则降序, 否则升序.
同时,如果传递了-f参数,则不区分大小写
同时,如果传递了-d参数,则仅仅对alpha字符排序.
同时,如果参数中有+2 -10,则仅仅比较第2个字符到第10个字符
 
二. 程序源码
//main.c
#include
#include
 
#define NUMERIC 1
#define DECR 2
#define FOLD 4
#define DIR 8
 
#define MAXLINES 5000
#define MAXLEN 1000
#define MAXSTORAGE 10000
 
char *lineptr[MAXLINES];
char lines[MAXSTORAGE];
 
 
int charcmp(char *, char *);
void error(char *);
int numcmp(char *, char *);
void readargs(int argc, char *argv[]);
int p_readlines(char *lineptr[], int maxlines);
void p_qsort(void *v[], int left, int right, int (*comp)(void *, void *));
void writelines(char *lineptr[], int nlines, int order);
 
char option = 0;
int pos1 = 0;
int pos2 = 0;
 
int main(int argc, char *argv[])
{
    int nlines;
    int rc = 0;
    
    readargs(argc, argv);
    if ((nlines = p_readlines(lineptr, MAXLINES)) > 0) {
        if (option & NUMERIC)
            p_qsort((void **)lineptr, 0, nlines-1, (int (*)(void *, void *))numcmp); 
        else
            p_qsort((void **)lineptr, 0, nlines-1, (int (*)(void *, void *))charcmp);   
            
        writelines(lineptr, nlines, option & DECR);
    } else {
        printf("input too big to sort!\n");
        rc = -1;    
    }   
    
    system("pause");
    return rc;
}
 
void readargs(int argc, char *argv[])
{
    int c;
    
    while (--argc > 0 && (c = (*++argv)[0]) == '-' || c == '+') {
        if (c == '-' && !isdigit(*(argv[0]+1)))
        {
            while (c = *++argv[0])
           
                switch(c) {
                case 'd':
                    option |= DIR;
                    break;
                case 'f':
                    option |= FOLD;
                    break;
                case 'n':
                    option |= NUMERIC;
                    break;
                case 'r':
                    option |= DECR;
                    break;
                default:
                    printf("sort: illegal option %c\n", c);
                    error("Usage: sort -dfnr [+pos1] [-pos2]");
                    break;    
                }
            }
        } else if (c == '-') {
            pos2 = atoi(argv[0]+1);
        } else if ((pos1 = atoi(argv[0]+1)) < 0) 
            error("Usage: sort -dfnr [+pos1] [-pos2]");     
    }  
    
    if (argc || pos1 > pos2)
        error("Usage: sort -dfnr [+pos1] [-pos2]");       
}
 
int p_readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p = lines, line[MAXLEN];
    
    nlines = 0;
    
    printf("Please input a string(# to end input): ");
    while ((len = getline(line, MAXLEN)) > 0)
    {
        if (strcmp(line, "#\n") == 0)
            break;
            
        if (nlines >= maxlines || p + len >= lines + MAXSTORAGE)
            return -1;
        else {
            line[len - 1] = '\0';
            strcpy(p, line);
            lineptr[nlines++] = p;
            p += len;
        }
        
        printf("Please input a string(# to end input): ");  
    }    
    
    return nlines;
}
 
void writelines(char *lineptr[], int nlines, int order)
{
    int i;
    
    if (order)
        for (i = nlines -1; i >= 0; i--)
            printf("%s\n", lineptr[i]);
    else
        for (i = 0; i < nlines; i++)
            printf("%s\n", lineptr[i]); 
        
    printf("\n");
}
 
void swap(void *v[], int i, int j)
{
    void *temp;
    
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;    
}
 
int getline(char s[], int lim)
{
    int c, i;
 
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
 
    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
 
    s[i] = '\0';
    return i;
}
 
void p_qsort(void *v[], int left, int right, int(*comp)(void *, void *))
{
    int i, last;
    
    if (left >= right)
        return;
    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++)
    {
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);    
    }    
    swap(v, left, last);
    p_qsort(v, left, last - 1, comp);
    p_qsort(v, last + 1, right, comp);
}
 
void error(char *s)
{
    printf("%s\n", s);
    exit(1);    
}
 
//numcmp.c
#include
#include
#include
 
#define MAXSTR 100
 
void substr(char *s, char *t, int maxstr);
 
int numcmp(char *s1, char *s2)
{
    double v1, v2;
    char str[MAXSTR];
    
    substr(s1, str, MAXSTR);
    v1 = atof(str);
    substr(s2, str, MAXSTR);
    v2 = atof(str);
    if (v1 < v2)
        return -1;
    else if (v1 > v2)
        return 1;
    else
        return 0;    
}
 
#define FOLD 4
#define DIR 8
 
int charcmp(char *s, char *t)
{
    char a, b;
    int i, j, endpos;
    extern char option;
    extern int pos1, pos2;
    
    int fold = (option & FOLD) ? 1: 0;
    int dir = (option & DIR) ? 1: 0;
    
    i = j = pos1;
    if (pos2 > 0) 
        endpos = pos2;
    else if ((endpos = strlen(s)) > strlen(t))
        endpos = strlen(t);
    
    do {
        if (dir) {
            while (i < endpos && !isalpha(s[i]) && s[i] != ' ' && s[i] != '\0')
                i++;
            while (j < endpos && !isalpha(t[j]) && t[j] != ' ' && t[j] != '\0')
                j++;    
        }    
        
        if (i < endpos && j < endpos) {
            a = fold ? tolower(s[i]): s[i]; 
            i++;
            b = fold ? tolower(t[j]): t[j];
            j++;
            if (a == b && a == '\0')
                return 0;   
        }
    } while (a == b && i < endpos && j < endpos);
    
    return a - b;  
}
 
//substr.c
#include
 
void error(char *);
 
void substr(char *s, char *str)
{
    int i, j, len;
    extern int pos1, pos2;
    
    len = strlen(s);
    if (pos2 > 0 && len > pos2)
        len = pos2;
    else if (pos2 > 0 && len < pos2)
        error("substr: string too short");
    for (j = 0, i = pos1; i < len; i++, j++)
        str[j] = s[i];
    str[j] = '\0';    
}

关键字:字符串  数字排序  编写程序 引用地址:编写程序实现对输入的字符串排序(可以规定比较的字符)

上一篇:文字转声明: 编写程序将特定格式的输入转换为C语言声明
下一篇:编写程序实现对输入的字符串排序(不区分大小写)

推荐阅读最新更新时间:2024-03-16 14:46

unsigned char 转字符串
通常送显示的都是字符串,对于int long float转字符串有对应的函数,还有sprintf进行格式输出,对于嵌入式和单片机大多都用unsigned char型变量,转字符串需要自己编写函数,需要自己编写函数,一下是网上人写的一个函数。 unsigned char Dec2Asc(unsigned char input, char* output ) { unsigned char ucLen; unsigned char ucDiv; //判断有效数字最高位 for ( ucDiv = 100; 1 ucDiv; ucDiv /= 10 ){ if ( input / ucDiv ){
[单片机]
51单片机字符串口通信为什么乱码?终于找到原因了
被这个问题卡了3天,代码很简单就是乱码出问题,烦恼! 后来查资料找到原因,晶振12MHz和11.0592Hz的问题。 如果你用的是12Mhz的单片机,定时器初值TH1一般要设置到E6(2400bps)、F3(4800bps)。 对应的在上位机配置UART串口时,选取2400 4800bps。如果试了不行,那就换更低的1200bps。 修改前 修改后 做了半天才发现我的晶振是11.0592Mhz,为啥对应的开发板视频讲的是12Mhz。 以4800bps为例,TH1=TL1=0xF4,SMOD=1,波特率翻倍=2*2400bps。这样就不会乱码了 ------------------------------
[单片机]
51单片机<font color='red'>字符串</font>口通信为什么乱码?终于找到原因了
MSP430的485通信程序(接收字符串指令)
/************************************************************** 程序功能:通过RS485端口一次一次地收发数据 --------------------------------------------------------------- 测试说明:用示波器观察RS485端口A、B信号线 上的波形或者用RS485接收器接收发回 的字符,在串口助手上显示。 ***************************************************************/ #include msp430x14x.h #d
[单片机]
Stm32串口发送字符串数据
ps:把字符串分成字节循环发送 /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include stm32f10x_crc.h #include system_stm32f10x.h #include stdio.h #define PUTCHAR_PROTOTYPE int __io_putchar(in
[单片机]
汇编程序:比较2个字符串是否相同(初级版)
DATAS SEGMENT source1 db 50 dup(?) ; 存放第一个串 source2 db 50 dup(?) ; 存放第二个串 title1 db 'Please input the first string:',0dh,0ah,'$' title2 db 'Please input the second string:',0dh,0ah,'$' ans db 'match',0dh,0ah,'$' ans1 db 'no match',0dh,0ah,'$'
[单片机]
KUKA机器人系统函数StrCopy()复制字符串变量的方法
用函数 StrCopy() 可以将字符串变量的内容复制到另一个字符串变量中。 Copy = StrCopy( StrDest , Stource ) 元素 说明 Copy 类型:BOOL 返回值的变量。返还值: n 成功地复制了字符串变量:TRUE n 没有复制字符串变量:FALSE StrDest 类型:CHAR 框 将字符串复制到该字符串变量中。 因为 StrDest 是 CHAR 类型的数组,则单个字符以及常数非法。 StrSource 类型:CHAR 框 复制该字符串变量的内容。 例:
[机器人]
利用STM32单片机串口发送字符串
最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。 其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。 //程序功能:利用串口发送一个字符串 // 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6) str 需要发送的字符串 #include “stm32f10x.h” void Usart_SendString(USART_TypeDef* US
[单片机]
mini2440串口模块总结
一.串口工作原理: 1.由上面的串口电路可知具体流程如下: 发送:写数据——》buffer—》shifter—》TXDn-- RSTXDn--- PC 接收:PC---》RSRXDn---》RXDn--- shifter-- buffer--- 取数据 2.由上图可知, buffer有两种模式,FIFO模式 和 Non-FIFO模式。 如果使用FIFO模式,则需要配置FIFO Register,具有64 字节的缓存可用。 如果使用Non-FIFO模式,则不需要配置FIFO Register,但是只具有一个字节的缓存可用。 3.做串口模块的具体流程: 1 .从串口电路图中可以知道,我们首先应
[单片机]
mini2440串口模块总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved