给定一个字符串如“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;
}
答案 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));