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