C++ 字符串转换c++;

C++ 字符串转换c++;,c++,char,C++,Char,我有一个字符串,第一个元素是例如“a”。我已经声明了一个名为a的变量(例如,int a=1)。我现在的问题是,如何将整个字符串转换为数字(a=1,b=2,c=3,…z=26)?例如: string str=“你好”这必须更改为“85121215”,然后更改为85121215。我给您写了一个简单的例子。它创建了一个包含a-1,b-2,c-3。。。对。然后使用stringstream连接这些值: #include <iostream> #include <map> #incl

我有一个字符串,第一个元素是例如“a”。我已经声明了一个名为a的变量(例如,int a=1)。我现在的问题是,如何将整个字符串转换为数字(a=1,b=2,c=3,…z=26)?例如:


string str=“你好”这必须更改为
“85121215”
,然后更改为85121215。

我给您写了一个简单的例子。它创建了一个包含a-1,b-2,c-3。。。对。然后使用stringstream连接这些值:

#include <iostream>
#include <map>
#include <sstream>

int main()
{
    std::string str = "abc";
    std::map<char,int> dictionary;
    int n = 1;
    for(char c='a'; c<='z'; c++)
        dictionary.insert(std::pair<char,int>(c,n++));

    //EDIT if you want uppercase characters too:
    n=1;
    for(char c='A'; c<='Z'; c++)
        dictionary.insert(std::pair<char,int>(c,n++));        

    std::stringstream strstream;

    for(int i=0; i<str.size(); i++)
        strstream<<dictionary[str[i]];

    std::string numbers = strstream.str();

    std::cout<<numbers;

    return 0;
}
#包括
#包括
#包括
int main()
{
std::string str=“abc”;
地图词典;
int n=1;

对于(char c='a';c,您的定义有点小:

"hello" = "85121215
h = 8
e = 5
l = 12
o = 15
我想你是这个意思吧

a = 1
b = 2
...
z = 26
在这种情况下,这并不难:

std::string meh_conv(char c) {
    switch(c) { // (or `switch(tolower(c))` and save some typing)
    case 'a': case 'A': return "1";
    case 'b': case 'B': return "2";
    ....
    case 'z': case 'Z': return "26";
    ....
    // insert other special characters here
    }
    throw std::range_error("meh");
}

std::string meh_conv(std::string const &src) {
    std::string dest;
    for (const auto c : s)
       dest += meh_conv(c);
    return dest;
}
或者使用
std::transform()

#包括
std::字符串dest;
std::transform(src.begin()、src.end()、back_inserter(dest),
meh_conv)
(不适用于不同的传入和传出类型,至少不适用于原样)


增编

您可能希望参数化替换贴图:

std::map<char, std::string> repl;
repl['a'] = repl['A'] = "0";
repl[' '] = " ";


std::string src = "hello";
std::string dest;
for (const auto c : src) dest += repl[c];
std::map repl;
repl['a']=repl['a']=“0”;
答复['']='';
std::string src=“hello”;
std::字符串dest;
for(const auto c:src)dest+=repl[c];
//转换本身并不关心我们使用什么编码
std::string转换_string(std::string const&in,std::function op)
{
std::ostringstream out;
std::transform(in.begin()、in.end(),
std::ostream_迭代器(out),
op);
return out.str();
}
//每个字符的映射很容易分离
int ascii_az_映射(字符ch)
{
if(ch<'a'| ch>'z'){
std::ostringstream错误;
错误容易接近,
您可以找到96字符的mod of char(a前面的ASCII值),因此它将始终为您提供范围为1-26的值

int value;
string s;
cin>>s;
for(int i=0; i<s.size();i++){
    value = s[j]%96;
    cout<<value<<endl;

}
int值;
字符串s;
cin>>s;

对于(int i=0;iIt不清楚您正在尝试做什么。请发布一些代码并解释您迄今为止尝试了什么。您希望数字(输出、容器、替换字母)在哪里?例如:string str=“hello”;必须将其更改为“85121215”,然后更改为85121215您将如何处理“敏捷的棕色狐狸跳过了懒惰的狗”?您定义的整数表示形式不适合任何内置类型。@jrok,您需要一个“The”"在那里。无论如何,我可能会使用你的解决方案,然后,假设输入符合程序规范的要求。它的问题与@infact的解决方案相同,它假设字符
a
to
z
是连续的。@RedX标准只保证字符0-9是连续的。但实际上,是的s、 a-z是连续的。但有一点不同:。我认为一张便条就可以了。没有好办法保持它的便携性。我看到的唯一选择是逐个检查每个字母以获得一个映射/函数。那时我真的不理解这个问题。你能写一个这样做不起作用的例子吗?@bali182,如果使用EBCDIC,任何j及以上的东西都不会起作用使用了ing。也可以
切换(tolower(c))
并节省一些键入时间。或者在编译时隔离:
#如果'B'-'A'==1&&c'-'A'==2
或者
枚举字母是{val='B'-'A'==1&&…}
。我曾经这样做过。绝对-使用预处理程序中的魔法编写
默认地图
// transformation itself doesn't care what encoding we use
std::string transform_string(std::string const &in, std::function<int(char)> op)
{
    std::ostringstream out;
    std::transform(in.begin(), in.end(),
                   std::ostream_iterator<int>(out),
                   op);
    return out.str();
}

// the per-character mapping is easy to isolate
int ascii_az_map(char ch)
{
    if (ch < 'a' || ch > 'z') {
        std::ostringstream error;
        error << "character '" << ch << "'=" << (int)ch
              << " not in range a-z";
        throw std::out_of_range(error.str());
    }
    return 1 + ch - 'a';
}

// so we can support other encodings if necessary
// NB. ebdic_to_ascii isn't actually implemented here
int ebcdic_az_map(char ch)
{
    return ascii_az_map(ebcdic_to_ascii(ch));
}

// and even detect the platform encoding automatically (w/ thanks to Phresnel)
// (you can still explicitly select a non-native encoding if you want)
int default_az_map(char ch)
{
    #if ('b'-'a' == 1) && ('j' - 'i' == 1)
        return ascii_az_map(ch);
    #elif ('j'-'i' == 8)
        return ebcdic_az_map(ch);
    #else
        #error "unknown character encoding"
    #endif
}

// use as:
std::string str = "hello";
std::string trans = transform_string(str, ascii_az_map);
// OR ... transform_string(str, ebcdic_az_map);
int value;
string s;
cin>>s;
for(int i=0; i<s.size();i++){
    value = s[j]%96;
    cout<<value<<endl;

}