抓取字符串的一部分,例如 substr

Grabbing a portion of a string like substr

本文关键字:例如 substr 一部分 字符串 抓取      更新时间:2023-10-16

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

也许这符合您的要求? 很难说,因为您的初始实现更多地使用 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) 字符数组someSubString的大小为 1,无法容纳子字符串。

2)subsec未正确实现,应从索引0复制到Substring。还要记住在子字符串的末尾添加

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] = '';
}

你需要为某个子字符串分配超过 1 个字节,即

char someSubString[] = "xxxxxxxxxxxxxxxxxx";

或者只是

char someSubString[100];

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

两者都会为要复制到其中的字符串分配足够的空间。然后,您也没有对终止 0 执行任何操作。在 C 样式字符串的末尾,需要有一个终止 null 来表示字符串的结尾。否则 cout 会打印类似的东西;

abcdefgxxxxxxx

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

你的代码目前存在一些问题。首先,正如您的编译器无疑警告您的那样,C++字符串文字具有类型 const char[] ,而不仅仅是 char[]

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

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

说到 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] != '') {
        subs[i] = str[i];
        i++;
    }
    // Append the nul byte
    subs[i] = '';
    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;
}
相关文章: