C ++计算字符串中的数字

时间:2013-04-02 03:52:08

标签: c++ algorithm

给定一个字符串如“121”,我试图计算1和2的数字,然后返回字符串“2112”(因为有2个和1个)。我不知道我的代码中的问题在哪里,但我得到了荒谬的结果,如果有人能指出它出错的地方会很棒。到目前为止,这是我的代码:

现在有效,非常感谢。

string operate(string s) 
{  
    string input = "121; 
    int count[10] = {0}; 
    string answer; 

    for(int n = 0; n < input.length(); n++) 
    {              
        int a = (input[n]-'0');        
        count[a]++;
    }      

    for(int n = 1; n < 10; n++) 
    { 
        if(count[n] > 0)   
        {  
            stringstream ss;
            ss << count[n] << n;
            answer.append(ss.str());  
        }          
    }         
    return answer;
}

5 个答案:

答案 0 :(得分:3)

这里有三个问题。首先,在使用之前,您没有初始化内存。这样做非常简单:

int count[10]{}; //all 0

由于编译器支持的原因而失败,这样的事情会起作用:

int count[10] = {0};

接下来,您正在访问数组越界:

int a = input[n];         
count[a]++;

首先,将字符串中该字符的数值赋给a。如果ASCII正在使用且字符为'1',则为49.接下来,您将访问数组的元素a。你这里只有10个,但你可能正在访问它。由于数字字符代码是连续的,只需减去0即可获得整数形式的数字值:

int a = input[n] - '0';
count[a]++;

'1'为例,连续表示'1'已过去'0',因此'1' - '0'为1。

最后,你稍后会忽略数组的第一个元素。使第二个循环开始从0开始索引,而不是1。


有了这个,我可以建议使用一个字典(一些C ++ 11的乐趣)?

std::string input = "12113412"; 
std::map<char, int> count; //map characters to counts

for (char c : input) //loop through each character in string
    count[c]++; //this creates the element if it isn't

std::string result;

for (auto p : count) { //each value in map is a pair
   result += std::to_string(p.second) += p.first;
}

std::cout << result;

输出:

  

41221314

答案 1 :(得分:2)

您的代码存在多个问题。

首先,这个:

int count[10];

..不会初始化值。它们将是随机存储器地址。你想要这个:

int count[10] = { 0 };

..这使得数组中的所有项都初始化为0。

此外,您只在数组中声明了10个项目,但是:

int a = input[n];

..在“121”(1 == 49 ASCII)示例中的变量a中存储“49”。那你就是这样做的:

count[49]++; // Wrong.. there is no element 49

您似乎将数组用作某种Dictionary,而不是。{/ p>

只需将其更改为:

int a = input[n] - 48;
count[a]++;

..起作用。这是完整的输出:

std::string operate(std::string s) 
{   
    int count[10] = { 0 }; 
    string answer; 

    for(int n = 0; n < s.length(); n++) 
    {              
        int a = s[n] - 48;
        count[a]++;
    }      

    for(int n = 0; n < 10; n++) 
    { 
        if(count[n] > 0)   
        {  
            stringstream ss;
            ss << count[n] << n;
            answer.append(ss.str());  
        }          
    }         
    return answer;
}

..这将返回2112输入“121”。

答案 2 :(得分:1)

您指定给'a'的行应如下所示:

int a=todigit(input[n]);   

您目前正在做的是分配ASCII值,这将导致缓冲区溢出。

答案 3 :(得分:0)

int a = input [n]?

input [n]是一个char,一个将得到相应字符的ascii代码。对于您的示例,input [0]返回49,这是char“1”的ascii值。使用atoi将char转换为int将完成工作。

答案 4 :(得分:0)

你应该初始计算[10]。

memset(&count, 0, sizeof(count));