Dynamic Array只返回程序中的第一个元素

时间:2014-11-09 05:04:04

标签: 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)。

2 个答案:

答案 0 :(得分:3)

问题:在此代码中,

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或仅+=添加字符,而不是预先确定相关大小,然后创建该大小的字符串。结束。

答案 1 :(得分:2)

return *s1;

编译器将此视为*(s1 + 0),即仅将第一个元素视为。

你应该返回指针。

return s1;

相应地将功能的签名改为

string* doubleCons(string i) {