我正在尝试为学校创建一个函数,该函数返回一个数组,其中任何辅音都加倍(例如 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/