Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按大写字母顺序C+排列字符串+; 我试图创建一个C++程序,它按字母顺序排序给定字符串,大写字母在小写等价之前排序。 例子: DCBAdcba 排序字符串: AaBbCcDd_C++_String_Sorting - Fatal编程技术网

按大写字母顺序C+排列字符串+; 我试图创建一个C++程序,它按字母顺序排序给定字符串,大写字母在小写等价之前排序。 例子: DCBAdcba 排序字符串: AaBbCcDd

按大写字母顺序C+排列字符串+; 我试图创建一个C++程序,它按字母顺序排序给定字符串,大写字母在小写等价之前排序。 例子: DCBAdcba 排序字符串: AaBbCcDd,c++,string,sorting,C++,String,Sorting,下面是代码 #include <iostream> #include <string> #include <cctype> struct char_ { char c; char diff; char_(); char_(char x); }; char_::char_() { c = 0; diff = 0; } char_::char_(char x) { c = std::tolower(x);

下面是代码

#include <iostream>
#include <string>
#include <cctype>
struct char_ {
    char c;
    char diff;
    char_();
    char_(char x);
};
char_::char_() {
    c = 0;
    diff = 0;
}
char_::char_(char x) {
    c = std::tolower(x);
    diff = c - x;
}

void charswap(char_& x, char_& y) {
    char_ temp;
    temp = x;
    x = y;
    y = temp;
}

int main() {
    std::string str;
    getline(std::cin, str);
    char_* str2 = new char_[str.length()];
    for (int i = 0; i < str.length(); i++) {
        str2[i] = char_(str[i]);
    }

    /*
    for (int i = 0; i < str.length(); i++) {
        std::cout << str2[i].c << std::endl;
    }
    */
    for (int i = 0; i < str.length(); i++) {
        for (int j = i; j < str.length(); j++) {
            if (str2[i].c > str2[j].c)
                charswap(str2[i], str2[j]);
        }
    }


    for (int k = 0; k < str.length(); k++) {
    std::cout << str2[k].c << "\t" << (int)str2[k].diff << std::endl;
    }

    for (int i = 0; i < str.length(); i++) {

    str2[i].c = str2[i].c - str2[i].diff;
    }




    for (int i = 0; i < str.length(); i++) std::cout << str2[i].c;
    std::cout << "\n";
    return 0;
}
#包括
#包括
#包括
结构字符{
字符c;
字符差异;
char_uu2;();
char(char x);
};
char\:char\(){
c=0;
差异=0;
}
char\:char\(char x){
c=std::tolower(x);
diff=c-x;
}
无效字符交换(字符交换&x,字符交换&y){
温度;
温度=x;
x=y;
y=温度;
}
int main(){
std::字符串str;
getline(标准::cin,str);
char_*str2=新字符[str.length()];
对于(int i=0;istd::cout问题出在这一行:

if (str2[i].c > str2[j].c)
    charswap(str2[i], str2[j]);
它以不区分大小写的方式对字符进行比较,当小写字符相同时,不提供断开连接

当右侧的小写字母大于左侧的小写字母时,或者当小写表示形式相同,但右侧原始字符为大写字母时,需要修改此选项以交换字符:

if ((str2[i].c > str2[j].c) || (str2[i].c == str2[j].c && str2[j].diff))
    charswap(str2[i], str2[j]);
按字母顺序对给定字符串进行排序,排序方式为大写字母先于小写字母

您可以定义一个反映您意图的比较函子

#include <cctype>
#include <iostream>
#include <vector>
#include <algorithm>

struct case_cmp {
    bool operator()(char lhs, char rhs) const {
        return (std::isupper(lhs) && std::tolower(lhs) == rhs) || std::tolower(lhs) < std::tolower(rhs);
    }
};

std::string
可以被视为
char
s的容器,因此您可以将STL算法应用于其内容,包括
std::sort()
(就像您将STL算法应用于例如
std::vector

您可以使用lambda指定特定的自定义排序条件,将其作为第三个参数传递给
std::sort()
,例如()

#include//for std::sort
#包括//对于std::isupper,std::tolower
#include//for std::cout
#include//for std::string
使用名称空间std;
int main(){
字符串s{“DCBAdcba”};
排序(s.begin(),s.end(),[](字符x,字符y){
//自定义排序标准。
//如果x在y之前,则返回true。
//这可能有效,但需要更多的测试。。。
如果(isupper(x)){
如果(tolower(x)=y){
返回true;
}   
}
返回到下(x)<下(y);
});

听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:你创建了一个不区分大小写的排序算法。我看不到有任何错误DE给优先权。提示-搜索“ASCII表”,并注意分配给每个字符的值。@ UKMeXC++不必使用ASCIEBCDIC返回!
int main() {
    std::string s("DCBAdcba");
    std::sort(std::begin(s), std::end(s), case_cmp());
    // Outputs "AaBbCcDd"
    std::cout << s << std::endl;
}
#include <algorithm>    // for std::sort
#include <cctype>       // for std::isupper, std::tolower
#include <iostream>     // for std::cout
#include <string>       // for std::string
using namespace std;

int main() {
    string s{"DCBAdcba"};

    sort( s.begin(), s.end(), [](char x, char y) { 
        // Custom sorting criteria.
        // Return true if x precedes y.

        // This may work, but requires more testing...
        if (isupper(x)) {
            if (tolower(x) == y) {
                return true;    
            }   
        }
        return tolower(x) < tolower(y);
    });

    cout << s << '\n';
}