【问题标题】:map giving some ambiguous value地图给出了一些模棱两可的价值
【发布时间】:2018-05-19 11:02:38
【问题描述】:

预期的输出是“2a3b3c4d3l4z”但是 我得到:12a3b3c4d3l4z。

为什么输出中有额外的“1”?

char ipstr[] = "aabbbcccddddzzzzlll";
    cout<<"size of string:"<<sizeof(ipstr)<<endl;
    num = 0;
    map<char, int> ms;
    for(int i = 0; i<sizeof(ipstr);i++){
        if(ipstr[i] == ipstr[i+1])
            num++;
        else{
            ms[ipstr[i]] = num+1;
            num = 0;
        }
    }

    for(auto it = ms.begin();it != ms.end();it++){
        cout<<it->second<<it->first;
    }
    cout<<endl;

【问题讨论】:

  • 1) 您是否尝试过使用调试器单步执行您的代码? 2) ipstr[i+1] 是由于越界访问而导致的未定义行为。 3) 你知道,字符串文字以\0 字符结尾吗?
  • 首先 sizeof 不是获取字符串大小的最佳方法。此外,在 for 循环中,您会越界。将条件替换为 i
  • 让它变得简单。尝试 1 个字符。
  • @AlgirdasPreidžius 是的,是正确的。终止的 char 值在这里打印为 1.strlen 是否可以正常工作?有什么办法摆脱它?
  • @KirillKorolev 是的,将更改为 strlen(),谢谢。

标签: c++ dictionary stl containers


【解决方案1】:

额外的1 是条目{'\0', 1} 的打印输出,这是由于将尾随'\0' 带入循环而导致的。 \0 不可打印,因此您只能看到 1

【讨论】:

    【解决方案2】:

    您评估了包含 '\0' 字符的字符串长度(字符串以该字符结尾可能会模棱两可)。然后在 for 循环中,您将 '\0' 添加到地图中。但是打印空字符是什么意思。这就是为什么你在开头有 1 和一个空格。

    char ipstr[] = "aabbbcccddddzzzzlll";
    int n = strlen(ipstr);
    cout << "size of string:" << n << endl;
    int num = 0;
    map<char, int> ms;
    
    for (int i = 0; i < n - 1; i++) {
        if (ipstr[i] == ipstr[i + 1])
            num++;
        else {
            ms[ipstr[i]] = num + 1;
            num = 0;
        }
    }
    
    for (auto it = ms.begin(); it != ms.end(); it++) {
        cout << it->second << it->first;
    }
    cout << endl;
    

    【讨论】:

    • for(int i = 0; i
    • @sameerpradhan 你这样做了吗,如果它确实帮助你理解或解决你的问题,你也可以接受别人的回答?
    • @Kirill Korolev:你还没有回答他的问题。 为什么输出中会出现额外的“1”?
    • 该答案解决了 OP 的问题,但没有回答“为什么输出中出现额外的“1”?'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多