c++ - 字符串数据似乎在 for 循环后被删除

标签 c++ arrays string data-loss

在下面的代码中,每当我进入调试器时,段落的值都会被删除,或者返回到 0,我似乎无法弄清楚为什么,想法?

void getFreqLetter(string paragraph){
    char alphabet[26] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
    int counter[26];
    //set counter values to zero
    for (int clear = 0; clear < sizeof(counter) - 1; ++clear){
        counter[clear] = 0;
    }
    cout << paragraph;
    int result = 0;
    for (int i = 0; i < sizeof(paragraph); ++i){
        //case:found
        for (int j = 0; j < sizeof(alphabet) - 1; ++j){
            if (alphabet[j] == paragraph[i]){
                counter[j]++;
            }
        }
        //go through array find largest value
        for (int k = 0; k < sizeof(counter) - 1; ++k){
            if (counter[k] > result){ result = counter[k]; }
        }
        cout << result;
    }
}

最佳答案

综上所述,所有的问题都是因为你误用了sizeof

sizeof(paragraph) 并没有像您想象的那样做:它返回的是 string 类的大小,而不是 string 实例中的字符数。

假设它是 std::string 类型,您应该使用 paragraph.size()

sizeof(alphabet) 通过一个幸运的巧合返回数组中元素的数量:sizeof(char) 由标准定义是 1. 这样的“王牌”代码应该附加注释!

sizeof(counter) 就没那么幸运了。您返回的值是 sizeof(int) 的倍数,它因平台而异(2、4 和 8 很常见)。您应该编写 sizeof(counter)/sizeof(int)sizeof(counter)/sizeof(counter[0])。有些人更喜欢后者,因为您不需要对类型进行硬编码,而且 C++ 标准不允许使用零长度数组,counter[0] 定义明确。

(这里要记住的是 sizeof 在编译时计算)。

关于c++ - 字符串数据似乎在 for 循环后被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25760043/

相关文章:

c++ - 如何通过 HANDLE 判断一个堆是否被序列化?

c# - WPF 模板表单

java - 在 Java 中获取一个数组的值并使它们成为另一个数组的索引

arrays - 如何在没有临时数组的情况下对齐 2 个数组?

java - 在不使用 HashMap 的情况下查找排序的 ArrayList 中最常见的字符串

java - 如何将字符串转换为7位二进制

c - 为什么在 C 语言中退出 do-while 循环请求输入后程序会崩溃?

c++ - 如何检查模板的参数类型是否完整?

c - 数组条目在 C 中被覆盖

c++ - 按字母顺序选择排序程序的问题