0

所以我正在制作一个类似于 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

4 回答 4

1

也许这可以满足您的需求?很难说,因为您的初始实现更多地将长度参数用作结束位置。

#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;
}
于 2013-11-04T02:45:09.303 回答
0

您需要为 someSubString 分配超过 1 个字节,即

char someSubString[] = "xxxxxxxxxxxxxxxxxx";

要不就

char someSubString[100];

如果您知道您将需要的最大尺寸。

要么为您复制到它的字符串分配足够的空间。然后,您也没有对终止 0 做任何事情。在 C 样式字符串的末尾,需要有一个终止 null 来表示字符串的结尾。否则 cout 会打印类似的东西;

abcdefgxxxxxxx

如果您按照我的指示使用 x 进行初始化。

于 2013-11-04T02:44:40.380 回答
0

您的代码存在一些问题。首先,因为您的编译器无疑会警告您,在 C++ 中,字符串文字具有 type const char[],而不仅仅是char[].

其次,您需要有足够的空间来存储子字符串。一个很好的方法是让你的函数分配它需要的空间,然后传回一个指向这个内存的指针。这是通常在 C 代码中完成的方式。唯一的事情是你必须记住在完成后删除分配的数组。(在 C++ 中还有其他更好的方法可以做到这一点,比如智能指针和包装对象,但这些会在后面出现:-))。

第三,如果您请求的 alength实际上比传入的字符串长,您将遇到问题——您将跑到最后并开始复制随机内存(或只是崩溃),这绝对不是您想要的。C 字符串以“空字节”结尾——所以你需要检查你是否遇到过这个问题。

说到 nul,您需要确保您的子字符串以 1 结尾。

最后,这不是一个真正的问题,但不需要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;
}
于 2013-11-04T03:18:30.100 回答
0

代码有几个问题:

1) char 数组someSubString的大小为 1,不能容纳子字符串。

2)subsec没有正确实现,你应该Substring从索引0复制到。还记得\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';
}
于 2013-11-04T02:38:06.450 回答