none
中英文字符串排序代码没有作用,请大家帮忙看看哪里有问题? RRS feed

  • 问题

  • 大家好,我有个将用户姓名排序的问题,姓名包含中英文,我定义了一个简单的CUser类来记录用户的姓名和电话号码,如下:

    //User.h 
    #pragma once
    #include <string>
    using namespace std;
    
    class CUser
    {
    public:
    	CUser(void);
    	CUser(string name, string phoneNumber);
    	~CUser(void);
    
    	string Name;
    	string PhoneNumber;
    };
    
    //User.cpp
    #include "User.h"
    
    //默认构造函数,可以取消
    CUser::CUser(void)
    {
    	Name = "张三";
    	PhoneNumber = "12345678";
    }
    
    //通过构造函数传入参数,可直接复制形参,无需传址。用传入的值实例化一个对象
    CUser::CUser(string name,string phoneNumber)
    {
    	Name = name;
    	PhoneNumber = phoneNumber;
    }
    
    
    CUser::~CUser(void)
    {
    }
    

    然后定义一个简单的CSorter类,在其构造函数传入一个用户数组,并完成排序过程,代码如下:

    //Sorter.h
    #pragma once
    #include "User.h"
    
    class CSorter
    {
    public:
    	CSorter(void);
    
    	//通过构造函数,传入第一个数组,由于数组一般较大,需要传址
    	CSorter(CUser Users[]);
    
    	~CSorter(void);
    
    private:
    	//在这个类的内部将传入的的数组排序
    	void Sorter(CUser Users[]);
    };
    
    //Sorter.cpp
    #include "Sorter.h"
    
    
    CSorter::CSorter(void)
    {
    }
    
    CSorter::CSorter(CUser Users[])
    {
    	Sorter(Users);
    }
    
    
    CSorter::~CSorter(void)
    {
    }
    
    void
    CSorter::Sorter(CUser Users[])
    {
    	//如果数组为空,则直接退出
    	if(Users == NULL) return;
    
    	//获得数组中包含有多少个元素
    	int count = sizeof(Users)/sizeof(Users[0]);
    
    	//通过冒泡法将用户数组排序
    	for (int i = 0;i < count - 1; i++)
    	{
    		for (int j = i + 1; j < count; j++)
    		{
    			//由于strcmp需要传入的是char*,故定义char类型,不需要传址。		
    			//将string转换为char*,而不是const char*,故需要调用
    			int iLen = Users[i].Name.length();
    			char* name_i;
    			name_i =(char*)malloc((iLen+1)*sizeof(char));
    			Users[i].Name.copy(name_i,iLen,0);
    
    			//与第i个做相似处理
    			int jLen = Users[j].Name.length();
    			char* name_j;
    			name_j = (char*)malloc((jLen+1)*sizeof(char));
    			Users[j].Name.copy(name_j,jLen,0);
    
    			//判断两个字符串大小,如果前面的大,就交换两者的位置
    			if (strcmp(name_i,name_j)>0) 
    			{
    				CUser tempuser;
    				tempuser = Users[i];
    				Users[i] = Users[j];
    				Users[j] = tempuser;
    			}
    
    			//由于使用了malloc,故需要将指针销毁,避免内存泄露
    			delete name_i;
    			delete name_j;
    		}
    	}
    }

    然后,在Main函数中,应用一个用户数组,将用户数组传给Sorter类,代码如下:

    int main()
    {
    	//定义一用户数组,并实例化
    	CUser Users[] = 
    	{
    		CUser(),	//默认值
    		CUser("Jack", "010-62780936"),
    		CUser("Bond", "13324782134"),
    		CUser("李宁", "010-56428554"),
    		CUser("张飞", ""),
    		CUser("诸葛亮", "15844120725"),
    		CUser("阿卜杜拉", "0334-85612456"),
    		CUser("穆罕默德", "0411-52137841"),
    		CUser("Wang Qian", "5231-561435821")
    	};
    
    	//定义一Sort类,在构造函数中排序,传数组默认传入地址
    	CSorter sorter(Users);
    
    	//将结果再输出
    
    }
    但是结果没有发生变化啊,这个为啥啊?我的代码哪里有问题?请各位帮我看看啊。多谢了啊。

    2015年1月6日 10:49

答案

  • 你好:

         你应该学会去调试你的程序,在CSorter sorter(Users); 这一句前加个断点,按F11调试进去。一步一步的调试你会发现sorter函数的循环体内的代码根本没有执行。检查一些变量的值你会发现count的值为0,所以for循环体根本没有执行。

         原因是:在c++的函数里面,如果把一个数组作为参数传进去,那么这个数组就会退化为一个指针,因而就不知道这个数组的长度(这里的数组指的是静态的而不是new出来的. 在你这里就变成count=4/56=0了;

         解决办法:将数组的长度作为参数传入函数里:

    //Sorter.cpp #include "Sorter.h" CSorter::CSorter(void) { } CSorter::CSorter(CUser Users[],int count) { Sorter(Users,count); } CSorter::~CSorter(void) { } void CSorter::Sorter(CUser Users[],int count) { //如果数组为空,则直接退出 if(Users == NULL) return; //通过冒泡法将用户数组排序 for (int i = 0;i < count - 1; i++) { for (int j = i + 1; j < count; j++) { } } }

    //main 函数:

    int count = sizeof(Users)/sizeof(Users[0]);
     //定义一Sort类,在构造函数中排序,传数组默认传入地址
     CSorter sorter(Users,count);

    还有就是建议你弄本书学习下如何设计一个类,希望这些对你有帮助。

    Shu Hu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    • 已编辑 Shu 2017 2015年1月7日 4:30
    • 已标记为答案 Shu 2017 2015年1月16日 9:33
    2015年1月7日 4:28