所以我正在创建一个类似于SubStr的函数。这是一个赋值,所以我不能使用实际的函数来做到这一点。到目前为止,我已经创建了一个函数来获取一个字符串,然后获得所需的子字符串。我的问题是返回子字符串。在我执行Substring[b] = AString[b];
时的函数中,子字符串为空,但如果函数内部为cout
,则得到所需的子字符串。那我的代码有什么问题?
这是一个有效的演示:http://ideone.com/4f5IpA
#include <iostream>
using namespace std;
void subsec(char AString[], char Substring[], int start, int length);
int main() {
char someString[] = "abcdefg";
char someSubString[] = "";
subsec(someString, someSubString, 1, 3);
cout << someSubString << endl;
return 0;
}
void subsec(char AString[], char Substring[], int start, int length) {
for (int b = start; b <= length; b++) {
Substring[b] = AString[b];
}
}
答案 0 :(得分:1)
也许这就是您要找的东西?很难说,因为您的初始实现使用了length参数作为更多的结束位置。
#include <iostream>
using namespace std;
void subsec(char AString[], char Substring[], int start, int length)
{
const int end = start + length;
int pos = 0;
for(int b = start; b < end; ++b)
{
Substring[pos++] = AString[b];
}
Substring[pos] = 0;
}
int main()
{
char someString[50] = "abcdefghijklmnopqrstuvwxyz";
char someSubString[50];
subsec(someString, someSubString, 13, 10);
cout << someSubString << endl;
return 0;
}
答案 1 :(得分:0)
代码有几个问题:
1)char数组someSubString
的大小为1,不能保存子字符串。
2)subsec
未正确实现,您应该从索引0复制到Substring
。
还记得在子字符串的末尾添加\0
。
void subsec(char AString[], char *Substring, int start, int length) {
int ii = 0;
for (int jj = start; jj <= length; jj++, ii++) {
Substring[ii] = AString[jj];
}
Substring[ii] = '\0';
}
答案 2 :(得分:0)
你需要为someSubString分配超过1个字节,即
char someSubString[] = "xxxxxxxxxxxxxxxxxx";
或只是
char someSubString[100];
如果你知道你需要的最大尺寸。
要么为你要复制的字符串分配足够的空间。然后,你也没有做任何关于终止0的事情。在C样式字符串的末尾,需要一个终止空值来表示字符串的结尾。否则cout会打印出类似的内容;
abcdefgxxxxxxx
如果您按照我的指示使用x进行初始化。
答案 3 :(得分:0)
您的代码存在一些问题。首先,正如您的编译器无疑警告您,在C ++中,字符串文字的类型为const char[]
,而不仅仅是char[]
。
其次,您需要有足够的空间来存储子字符串。执行此操作的一种好方法是让您的函数分配所需的空间,然后将指针传递回此内存。这是通常在C代码中完成的方式。唯一的事情是你必须记住在完成它后删除已分配的数组。 (还有其他更好的方法可以在C ++中执行此操作,使用智能指针和包装器对象,但后来会出现这些:-))。
第三,如果您请求的length
实际上比传入的字符串长,那么您将遇到问题 - 您将运行结束并开始复制随机内存(或者只是崩溃),这绝对不是你想要的。 C字符串以“空字节”结束 - 因此您需要检查是否遇到过此问题。
说到nul,你需要确保你的子串以一个结束。
最后,这不是一个真正的问题,但不需要start
参数,如果你愿意,你只需将指针传递给数组的中间位置。
char* substring(const char* str, int length)
{
// Allocate memory for substring;
char* subs = new char[length+1];
// Copy characters from given string
int i = 0;
while (i < length && str[i] != '\0') {
subs[i] = str[i];
i++;
}
// Append the nul byte
subs[i] = '\0';
return subs;
}
int main()
{
const char someString[] = "foobarbaz"; // Note -- must be const in C++
char* subs = substring(someString + 3, 3);
assert(strcmp(subs, "bar") == 0);
delete subs;
}