从函数返回一个字符串

时间:2013-04-21 23:44:24

标签: c string return substring

我正在尝试在c上创建子字符串函数。它必须返回“cdef”,但它什么都不返回。我该如何解决?感谢。

#include<stdio.h>
#include<conio.h>
#include<string.h>

char* substring( char *, int, int );    

int main(){
    char stuff[] = "abcdefghjklmnoprstuvyz";
    printf("%s\n", stuff);
    printf("%s\n", substring(stuff, 2, 6));

    getch();
    return 0;
}

char* substring(char *text, int a, int b){
    char nText[b-a];
    char tmp[2];
    strcpy(nText, "");
    for(int i=a; i<b; i++){
        tmp[0] = text[i];
        tmp[1] = '\0';
        strcat(nText, tmp);
    }
    return nText;
}

3 个答案:

答案 0 :(得分:3)

您错误地返回指向函数返回后可能不存在的变量的指针。您需要在调用函数中分配空间,只需将结果放在提供的空间中,或者使用static在函数中创建永久空间。注意 - 正如Jonathan Leffler所指出的那样 - 由于空间是“永久的”,你不能将块的长度从一个调用改为下一个调用,你必须选择一个“合理的”值并测试{{ 1}}不长于分配的空间。因此,我的第二种方法更加健壮。

b-a+1

正如Employed Russian指出的那样,以这种方式使用静态在任何情况下都是非常危险的,因为当你仍在使用第一次调用的结果时,另一段代码可能会调用此函数。如果您进行任何类型的多线程,这是不可行的,但如果您有一个线程,这是一个快速修复。

更好的配方是

char* substring(char *text, int a, int b){
    static char nText[100];
    if ((b-a+1)>100) // do something! you can't copy this!
    // code
    return nText;
}

在后一种情况下,您在调用函数中创建空间并将指针传递给void substring(char *text, int a, int b, char *nText) { // code, nothing to return } 。你的主程序

substring

顺便说一下,复制子字符串的方法非常低效。考虑用

替换它
char shortString[100];
substring(stuff, 4, 6, shortString);
printf("%s\n", shortString);

通过此,您可以看到实际上需要分配for(int i=a; i<b;i++) nText[i-a]=text[i]; nText[b-a] = '\0'; 元素,否则最终nText[b-a+1]没有空间。

答案 1 :(得分:1)

你的错误在这里:

char* substring(char *text, int a, int b){
    char nText[b-a];
...
    return nText;
}

从函数返回后,您返回的缓冲区将变为无效

GCC很好地警告你:

t.c:24:5: warning: function returns address of local variable [enabled by default]
  

我该如何解决?

你必须分配一个新的缓冲区(并且调用者必须释放它),或者让调用者提供输出缓冲区(如Floris建议的那样)。

答案 2 :(得分:1)

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

char* substring( char *, int, int );    
char* substringb(char *substr, char *text, int a, int b);

int main(){
    char stuff[] = "abcdefghjklmnoprstuvyz";
    char substr[5];
    printf("%s\n", stuff);
    printf("%s\n", substring(stuff, 2, 6));//Things to think to be able to release!
    printf("%s\n", substringb(substr, stuff, 2, 6));

    getch();
    return 0;
}

//dynamic allocate
char* substring(char *text, int a, int b){
    char *nText;
    nText = (char*)malloc((b-a+1)*sizeof(char));
    strncpy(nText, &text[a], b-a);
    ntext[b-a] = 0;
    return nText;
}

//copy to reserve area
char* substringb(char *substr, char *text, int a, int b){
    substr[b-a]=0;
    return strncpy(substr, &text[a], b-a);
}
相关问题