c++ - 动态数组只从程序返回第一个元素

标签 c++ arrays memory dynamic

我正在尝试为学校创建一个函数,该函数返回一个数组,其中任何辅音都加倍(例如 Hello = HHellllo)。这是我的代码

#include <iostream>
#include <string>
using namespace std;

bool isConsonant(char c) {
    if ((c >=97 && c <= 122 && c != 'a' && c!= 'e' && c!= 'i' && c!= 'o' && c != 'u') | (c >=65 && c <= 90 && c != 'A' && c!= 'E' && c!= 'I' && c!= 'O' && c != 'U')) {
        return true;
    }
    else
        return false;
}

string doubleCons(string i) {
    int len = (int) i.length();
    int numCons = 0;

    for (int j = 0; j < len; j++) {
        if (isConsonant(i[j]) == true) {
            numCons++;
        }
    }
    int s1count = 0;
    string *s1 = new string[len+numCons];
    for (int j = 0; j < (len); j++) {
        if (isConsonant(i[j]) == true) {
            s1[s1count] = i[j];
            s1[s1count+1] = i[j];
            s1count += 2;
        }
        else {
            s1[s1count] = i[j];
            s1count++;
        }
    }
    return *s1;
}


int main() {

    string s = "Hello";
    s = doubleCons(s);
    cout << s << endl;
}

Main 只是一个测试,看它是否有效。问题是,main 的输出只是 H,没有别的。

我已经尝试循环遍历 s[i] 并且我只得到 H?????。我无法弄清楚为什么字符串不是 HHellllo 或 H 以外的任何东西。任何人都可以找出问题所在吗?我已经尝试使用 cout 语句进行调试,我认为 isConsonant 工作正常,第一个 for 循环(numCons = 3 对 hello 是正确的)。

最佳答案

问题:在这段代码中,

string doubleCons(string i) {
    int len = (int) i.length();
    int numCons = 0;

    for (int j = 0; j < len; j++) {
        if (isConsonant(i[j]) == true) {
            numCons++;
        }
    }
    int s1count = 0;
    string *s1 = new string[len+numCons];
    for (int j = 0; j < (len); j++) {
        if (isConsonant(i[j]) == true) {
            s1[s1count] = i[j];
            s1[s1count+1] = i[j];
            s1count += 2;
        }
        else {
            s1[s1count] = i[j];
            s1count++;
        }
    }
    return *s1;
}

string *s1 = new string[len+numCons];

分配一个字符串数组,而不是创建一个更长的字符串。

而是做这样的事情:

string s1( len+numCons );

是的,就是这么简单。


在其他新闻中:

  • 将名称 i 用于循环计数器以外的任何东西都不是一个好主意,因为有一个非常强大的约定。按照惯例,i 表示整数。这源于旧的 Fortran,它是从数学中得到的。

  • true 进行比较是不必要的,而且通常不是一个好主意(因为某些 C 函数返回 1 以外的数字以指示逻辑真)。考虑“我有房子”与“我有房子是真的”与“我有房子是真的”等等:这些比较对意义没有任何帮助。

  • 无需预先确定相关大小然后创建该大小的字符串,您可以简单地从一个空结果字符串开始并使用 push_back 或仅使用 += 在末尾添加字符。

关于c++ - 动态数组只从程序返回第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825170/

相关文章:

c++ - Linux下如何创建和监控子进程?

c++ - 在 C++ 中实例化指向新对象的指针时出现问题

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

objective-c - 为什么我的程序在使用 self.property 访问属性时会崩溃?和一个合成的访问器?

java - Tomcat内存消耗问题

Docker 容器的内存消耗从不减少(或者是吗?)

c++ - 例如,在 C++ 中,setprecision (12) 和 setprecision (012) 之间的区别是什么原因?

java - Android NDK释放内存

jQuery "TypeError: invalid ' in' 操作数 a"

python - 在 python 中迭代 JSON 并根据键过滤值以获得所需的结果