【问题标题】:How to write a function that will return part of char * in C?如何编写一个将在 C 中返回部分 char * 的函数?
【发布时间】:2014-09-11 01:03:44
【问题描述】:

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

这是我尝试过的:

#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'}。正如您在我的 main 中看到的那样,我使用 0 开始索引和长度为 2 调用了该函数,因此它应该获取前两个字符。任何想法,如何解决它?

【问题讨论】:

  • 您在哪一行得到错误?此外,sizeof(a) 返回指针的大小,而不是 a 指向的结构的大小。而且你不会释放 malloc 的内存。
  • @MrLister 它不显示任何行号,它可以编译,但是当我运行它时,我得到一个分段错误错误。
  • 在这种情况下,将一些诊断输出添加到程序的关键位置。 puts("Now about to calculate the size"); 之类的东西,这样你就知道程序在崩溃之前走了多远。
  • 你必须在调试器中运行你的程序。
  • 反正size的定义不好会出问题;在示例中它应该是 2,但它变成了 4(或 8,取决于您的设置)。所以你正在阅读超出分配的内存。

标签: c arrays substring


【解决方案1】:
   char *a = {'a', 'b', 'c'};

不是有效的 C 代码。请启用您的编译器警告。

如果你想要char 的数组,请使用:

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

或者对于一个空终止的字符串:

char a[] =  "abc"; 

【讨论】:

  • 如果我这样更改它,它甚至无法编译,我收到一条错误消息:从类型'char *'分配给类型'char [3]'时类型不兼容
  • 使用另一个指针变量作为返回值:char *b; b = f(a, 0, 2, 3);
  • 就像我说的,那是因为你错误地计算了size。这是我的第一条评论。
  • 将大小设置为 len 参数;例如,您可以先#define LEN 2,然后再使用b = f(a, 0, LEN, 3); size = LEN;,或者您可以使用实数、以空值结尾的字符串。
  • @ett 这是一个完全不同的问题,抱歉。
【解决方案2】:

这在 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;

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 2012-02-14
    • 2012-02-27
    • 1970-01-01
    • 2011-06-24
    • 2012-12-25
    • 2021-12-28
    • 2015-01-24
    相关资源
    最近更新 更多