在c中编写子字符串函数

时间:2014-04-26 17:49:14

标签: c substring

char *substring(char *string, int index, int length)
{
    //int counter = length - index;
    int counter = 0;
    for(;string[index] != string[length];index++, counter++);
    printf("\n%d\n", counter);
    char *array = malloc(sizeof(char) * counter);
    if(array != NULL)
    {
        ///while(string[index] != string[length])
        while(index != length)
            {
                array[index] = string[index];
                index++;
                array++;
            }
    }
    else
        puts("Dynamic allocations failed\n");
    return array;
}   

1 - 我已经用“长度 - 索引”来评论初始化计数器,因为我对它感觉不舒服(我还有点像循环的一行:))。所以,如果我以这种更简单的方式使用它,我可以指望反击。

2 - 我对此代码的问题在于它没有返回任何内容。我尝试printf结果但没有打印,当我将函数的结果分配给char *时,我得到一个错误,说我不能为char *分配一个空格。但它如何回归无效?

3 - 我可以用指针算法编写这个函数而根本没有任何数组索引吗?!

4 - 我可以改变char *数组吗?!我问这个是因为我认为char *不能变异,但我读过一个正确改变了char *的代码。或者是我混淆了常规字符*和字符串?

注意:我不想使用字符串库函数

3 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

for(;string[index] != string[length];index++, counter++);

首先,在上面一行中,你需要从长度中减去一个,因为数组是0索引的。

如果子字符串的最后一个字符在子字符串中的其他位置重复,则该行也将中断。例如aba,其中index = 0,length = 3.即使你没有到达子串的末尾,你的循环也会立即停止,因为string [0] == string [2]。

但是,用于计算子字符串长度的整个循环是不必要的,只需使用length

char* array = malloc(length + 1);

请注意,您需要+1包含C字符串中标准的空终止符。

接下来,如果index不为0,则此行无法正常工作。

array[index] = string[index];

indexstring的索引,而不是array的索引。您应该为迭代器使用另一个变量,该变量从索引开始然后递增。然后你可以从迭代器中减去index来获得子串array中的实际索引。

int i = index;
while(i < length)
{
    array[i - index] = string[i];
}

另请注意,循环中的这一行是不必要的,会破坏您的代码。

    array++;

您的迭代器正在递增,因此您无需递增array指针。另外,如果你直接增加array,那么当你返回它时,它指向哪里?它指向字符串的结尾,而不是开头,所以当然你没有输出。

最后,不要忘记添加空终止符。循环之后,因为你的迭代器现在可以方便地指向最后一个索引,只需执行

array[i] = '\0';

作为额外的,因为您专门创建一个新字符串来保存子字符串而修改原始string指针,所以您应该将字符串的参数声明为const 。例如:const char *string。这不是必需的,但是number of reasons的const正确性非常重要。

如果您进行了上述更改,您的代码应该可以正常工作。我没有发布已完成的代码,因为我认为自己进行更改是一项有价值的练习。

答案 1 :(得分:1)

1 - 您可以使用for循环,但这是一种缓慢的方式。简单的减法可以立即完成相同的工作,我认为没有理由不对它感到满意。

2 - Printf - 删除for循环末尾的分号,关于指针:

void *通用指针类型。您应该将其转换为char *,如下所示:

char *array = (char *)malloc(sizeof(char) * counter);

3 - 是的,*(ptr + 3)相当于ptr[3]。在大多数实现中,使用指针也要快一点。

4 - 是的,您可以修改char *指针指向的内存。它会修改原始字符串,但我不确定这是否是你的目标。

答案 2 :(得分:0)

100%工作

    #include "stdafx.h"
    #include "stdlib.h"
    void substring(char * src, char * dst, int index, int length);
    int _tmain(int argc, _TCHAR* argv[])
    {
        char orig[]="test";
        char * newchar = (char*)malloc(2);//1 char + null

        substring(orig, newchar, 1, 1);

        printf(newchar);

        free(newchar);
        system("pause");
        return 0;
    }

void substring(char * src, char * dst, int index, int length)
{
    // Assign src_index to our initial index
    // Assign a new counter for dst position
    // We want only up to the length hence index+length
    // Increment src_index and dst_index
    for(int src_index = index, dst_index = 0; src_index < index + length; src_index ++, dst_index++)
    {
        dst[dst_index] = src[src_index];
    }
    dst[length++] = '\0'; // Null terminate the string, we already accounted for this above.
}