C++ 字符串排序

输入四个英文句子,按照首字母的顺序排序后输出四个句子。
1.排序时不分区大小写)
2.若存在两个相同的首字母,则按照第二个字母的顺序排序,如果第二个字母顺序相同,则按照第三个字母顺序排序……
【strcmp即可直接实现字符串的比较,但是不能实现“不区分大小写”的比较】
“what a beautiful flower”
“Hello world”
“how are you”
“nice to meet you”

 运行截图

pubfunc.h

#ifndef _PUBFUNC_H
#define _PUBFUNC_H

#include<stdio.h>

#define _in_
#define _out_
#define MAXSIZE 256

//功能:将单个英文字符转化为大写 非英文字符不变
//参数:ch 需要转换的字符
//返回:转换后的字符
char _to_upper(char _ch);

//功能:将字符串中英文字符转化为大写 非英文字符不变
//参数:_str 需要转换的字符串
//返回:转换后的字符串
char* to_upper(char* _in_ _str);

//功能:将单个英文字符转化为小写 非英文字符不变
//参数:ch 需要转换的字符
//返回:转换后的字符
char _to_lower(char _ch);

//功能:将字符串中英文字符转化为小写 非英文字符不变
//参数:_str 需要转换的字符串
//返回:转换后的字符串
char* to_lower(char* _in_ _str);

//功能:比较字符串_str1和字符串_str2的大小 依据ASCII码大小比较字符串对应顺序单个字符的大小 若首字母相等则比较第二个依次类推 
//参数:_str1 需要比较的字符串1
//参数:_str2 需要比较的字符串2
//返回:0-_str1=_str2  <0-_str1<_str2 >0-_str1>_str2
int _strcmp(const char* _in_ _str1, const char* _in_ _str2);

//功能:将字符串初始化
//参数:_dest 需要初始化的字符串
//参数:_ch 初始化的字符
//参数:sizeof_str1 初始化的长度
//返回:初始化后字符串
void* _memset(char* _in_ _out_ _dest, char _in_ _ch, int sizeof_dest);

//功能:将字符串_sorc复制到_dest
//参数:_dest 目的地的字符串
//参数:_sorc 被复制的字符串
//返回:复制后字符串_dest
char* _strcpy(char* _in_ _out_ _dest, const char* _in_ _sorc);

//功能:将多个字符串数组排序
//参数:_array 需要排序的二维数组指针
//参数:sizeof_array 需要排序的字符串的个数
//返回:0-成功 -1-失败
int sort_array(char** _in_ _out_ _array, int sizeof_array);


#endif // _PUBFUNC_H

  pubfunc.cpp

#include "pubfunc.h"

char _to_upper(char _ch)
{
	if (_ch >= 'a' && _ch <= 'z')
	{
		_ch = _ch - 32;
	}
	return _ch;
}

char* to_upper(char* _in_ _str)
{
	if (NULL == _str)
	{
		return NULL;
	}

	char* p = _str;
	while (*p) *p++ = _to_upper(*p);

	return _str;
}

char _to_lower(char _ch)
{
	if (_ch >= 'A' && _ch <= 'Z')
	{
		_ch = _ch + 32;
	}
	return _ch;
}

char* to_lower(char* _in_ _str)
{
	if (NULL == _str)
	{
		return NULL;
	}

	char* p = _str;
	while (*p) *p++ = _to_lower(*p);

	return _str;
}

int _strcmp(const char* _in_ _str1, const char* _in_ _str2)
{
    const unsigned char *s1 = (const unsigned char *) p1;
    const unsigned char *s2 = (const unsigned char *) p2;
    unsigned char c1, c2;

    do
    {
        c1 = (unsigned char) *s1++;
        c2 = (unsigned char) *s2++;
        if (c1 == '\0')
        return c1 - c2;
    }
    while (c1 == c2);

    return c1 - c2;
}

void* _memset(char* _in_ _out_ _dest, char _in_ _ch, int sizeof_dest)
{
	if (NULL == _dest)
	{
		return NULL;
	}

	char* p = _dest;
	int i;
	for (i = 0; i< sizeof_dest-1; i++)
	{
		*p++ = _ch;
	}
	*p = '\0';
	return _dest;
}

char* _strcpy(char* _in_ _out_ _dest, const char* _in_ _sorc)
{
	if (NULL == _dest || NULL == _sorc)
	{
		return NULL;
	}
	char* p = _dest;
	char* q = (char*)_sorc;
	while (*q)
	{
		*p++ = *q++;
	}
	*p = '\0';
	return _dest;
}

int sort_array(char** _in_ _out_ _array, int sizeof_array)
{
	//以指针排序
	char** p = _array;
	int len = sizeof_array;
	//简单的采用冒牌排序
	char temp[MAXSIZE] = { 0 };
	int i, j;
	for (i = 0; i < len - 1; i++) /* 外循环为排序趟数,len个数进行len-1趟 */
	{
		for (j = 0; j < len - 1 - i; j++)
		{ /* 内循环为每趟比较的次数,第i趟比较len-i次 */
			if (_strcmp(*(p + j), *(p + j + 1)) > 0)
			{ /* 相邻元素比较,若逆序则交换(升序为左大于右,降序反之) */
				_memset(temp, 0x00, sizeof(temp));
				_strcpy(temp, *(p + j));

				_memset(*(p + j), 0x00, MAXSIZE);
				_strcpy(*(p + j), *(p + j + 1));

				_memset(*(p + j + 1), 0x00, MAXSIZE);
				_strcpy(*(p + j + 1), temp);
			}
		}
	}

//	//以下是以数组下标排序
// 	char** p = _array;
// 	int len = sizeof_array;
// 	//简单的采用冒牌排序
// 	char temp[MAXSIZE] = { 0 };
// 	int i, j;
// 	for (i = 0; i < len - 1; i++) /* 外循环为排序趟数,len个数进行len-1趟 */
// 	{
// 		for (j = 0; j < len - 1 - i; j++)
// 		{ /* 内循环为每趟比较的次数,第i趟比较len-i次 */
// 			if (_strcmp(p[j], p[j + 1]) > 0)
// 			{ /* 相邻元素比较,若逆序则交换(升序为左大于右,降序反之) */
// 				memset(temp, 0x00, sizeof(temp));
// 				strcpy(temp, p[j]);
// 				strcpy(p[j], p[j + 1]);
// 				strcpy(p[j + 1], temp);
// 			}
// 		}
// 	}
	
	return 0;
}

main.cpp

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pubfunc.h"

int main(int args, char* argv[])
{
	char test1[MAXSIZE] = "what a beautiful flower";
	char test2[MAXSIZE] = "Hello world";
	char test3[MAXSIZE] = "how are you";
	char test4[MAXSIZE] = "nice to meet you";

	char *test[] = { test1, test2, test3, test4 };

	printf("排序前:\n");
	char** q = test;
	printf("%s\n", (*(q + 0)));
	printf("%s\n", (*(q + 1)));
	printf("%s\n", (*(q + 2)));
	printf("%s\n", (*(q + 3)));

	int ret = sort_array((char**)test, 4);
	if (0 != ret)
	{
		printf("\n排序失败!\n");
	}

	printf("\n排序后:\n");
	char** k = (char**)test;
	printf("%s\n", k[0]);
	printf("%s\n", k[1]);
	printf("%s\n", k[2]);
	printf("%s\n", k[3]);

	return 0;
}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中,标准库并没有提供直接支持不等长字符串排序的函数,因为C++的`std::string`类型默认是等长的,即所有的字符数组都有相同的长度。如果你需要对不等长字符串进行排序,通常会用到自定义比较函数或者使用一些第三方库,如`boost`中的`multi_index_container`。 一个常见的做法是定义一个结构体或类,其中包含一个字符串和其长度,然后使用这个复合类型的容器来进行排序。这里是一个简单的例子: ```cpp #include <string> #include <vector> #include <algorithm> #include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/hashed_index.hpp> // 定义一个结构体,包含字符串和长度 struct StringWithLength { std::string str; size_t length; }; // 自定义比较函数,用于按长度排序 bool compareStringLength(const StringWithLength& a, const StringWithLength& b) { return a.length < b.length; } int main() { std::vector<StringWithLength> strings = {/*你的字符串列表*/}; // 使用boost的multi_index_container进行排序 boost::multi_index_container<StringWithLength, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::member<StringWithLength, size_t, &StringWithLength::length>>, boost::multi_index::hashed_unique<boost::multi_index::tag<>, boost::multi_index::member<StringWithLength, std::string const&, &StringWithLength::str>>>> my_string_list(strings); std::sort(my_string_list.begin(), my_string_list.end(), compareStringLength); // 现在我的_string_list已经是按长度升序排列的了 for (const auto& str : my_string_list) { std::cout << str.str << " (" << str.length << ")\n"; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值