抓住像substr一样的字符串的一部分

时间:2013-11-04 02:23:20

标签: c++

所以我正在创建一个类似于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];
    }
}

4 个答案:

答案 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;
}