如何编写一个函数来返回C中的部分char *?

时间:2014-07-20 10:33:46

标签: c arrays substring

我想在C中返回char *的part(或者说是substring)。关键是用户定义了我想要返回的起始索引和长度。首先,我检查给定值是否在范围内,如果不是,我想返回一个空值。

以下是我的尝试:

#include <stdio.h>
#include <stdlib.h>

char * f(char a[], int start, int len, int lenA)
{
    int i, j = 1;
    char *temp;

    if ((start + len) > lenA)
        return NULL;
    if (start < 0 || len < 0)
        return NULL;
    else if (len == 0) {
        temp = malloc(sizeof(char)*1);
        return temp;
    }

    temp = malloc(sizeof(char)*len);
    for (i = 0; len >= j; i++, j++) {
        temp[i] = a[start];
        start++;
    }

    return temp;
}

int main(void)
{
    int i;
    char *a = {'a', 'b', 'c'};

    a = f(a, 0, 2, 3);

    int size = sizeof(a) / sizeof(a[0]);

    if (a != NULL) {
        printf("{");
        for (i = 0; i < size; i++) {
            printf("'%c',", a[i]);
            if (i < (size - 1))
                printf(" ");
        }
        printf("}\n");
    }
    else printf("null\n");

    return 0;

}

关键是当我运行它时,我收到一条错误消息:Segmentation fault (core dumped) 相反,它应该打印:{'a', 'b'}。虽然正如你在我的主要部分中看到的那样,我用0起始索引调用了函数,并且长度为2,所以它应该得到前两个字符。任何想法,如何解决它?

2 个答案:

答案 0 :(得分:0)

   char *a = {'a', 'b', 'c'};

无效的C代码。请启用编译器警告。

如果您想使用char数组:

char a[]  = {'a', 'b', 'c'};

或对于以空字符结尾的字符串:

char a[] =  "abc"; 

答案 1 :(得分:0)

这对我在VS Express 2013上工作。我没有查看你的所有代码。但我似乎已经解决了这个问题。 int size = sizeof(a)/ sizeof(a [0]); - 这不应该起作用。您将指针的大小(4个字节)除以字符大小(1个字节)。

#include <stdio.h>
#include <stdlib.h>

char * f(char a[], int start, int len, int lenA)
{
    int i, j = 1;
    char *temp;

    if ((start + len) > lenA)
        return NULL;
    if (start < 0 || len < 0)
        return NULL;
    else if (len == 0) {
        temp = malloc(sizeof(char)* 1);
        return temp;
    }

    temp = malloc(sizeof(char)*len);

    for (i = 0; len >= j; i++, j++) {
        temp[i] = a[start];
        start++;
    }

    return temp;
}

int main(void)
{
    int i;
    char arr[] = { 'a', 'b', 'c' }; //code changed here

    char *a = f(arr, 0, 2, 3); //code changed here

    int size = 2; //code changed here - consider using the same variable for the length above and size here

    if (a != NULL) {
        printf("{");
        for (i = 0; i < size; i++) {
            printf("%c,", a[i]);
            if (i < (size - 1))
                printf(" ");
        }
        printf("}\n");
    }
    else printf("null\n");

    system("PAUSE");

    return 0;

}

如果您需要更多帮助,请与我们联系。我并没有对所有情况进行测试。另外,不要忘记释放动态分配的内存。