C 我可以返回数组而不是指针吗?如果不是,我可以使用指针吗?

C 我可以返回数组而不是指针吗?如果不是,我可以使用指针吗?,c,C,我正在创建这个函数,从一个较大的字符串中提取一个单词或字符串的一部分,它工作得很好,但我必须使用strcpy将它从指针转换为数组,是否可以返回一个数组 如果不可能,我可以直接使用指针吗? 我的意思是,使用指针而不是数组会导致头函数出现问题?或者我可以毫无问题地使用alla函数 #include <stdio.h> #include <string.h> char *substr(const char mainstring[], const int cstart, con

我正在创建这个函数,从一个较大的字符串中提取一个单词或字符串的一部分,它工作得很好,但我必须使用strcpy将它从指针转换为数组,是否可以返回一个数组

如果不可能,我可以直接使用指针吗? 我的意思是,使用指针而不是数组会导致头函数出现问题?或者我可以毫无问题地使用alla函数

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

char *substr(const char mainstring[], const int cstart, const int clength){
    // printf(" %s \n ", substr("To many Strings", 8,7)); // = Strings
    int main_length = 0;
    int over_length = 0;
    
    main_length = strlen(mainstring); // gets the length of mainstring[]
    over_length = ( main_length - (cstart + clength)); // the value must be greater than -1 and less than the length of the mainstring[]

    
    char *result = malloc(clength+1); // initialize by adding +1 for terminator \ 0
    
    //That must be equal to or greater than 0 and less than the maximum length of the mainstring
    if ( over_length >= 0 && over_length <= (cstart + clength)) { 
    
    strncpy(result, mainstring+cstart, clength); // copies the selected part to result
    strcat(result, "\0"); // add terminator EOS end of string
    
    }else{
    printf("\n Error: Excessive size : %d", over_length); //shows when the condition is not met
    
    }
    return result;
}

int main(){

// use the function substr("String", start, length)

printf(" %s \n ", substr("To many Strings", 8,7)); // = Strings

return 0;
}
#包括
#包括
char*substr(常量char mainstring[],常量int cstart,常量int clength){
//printf(“%s\n”,substr(“到多个字符串”,8,7));/=Strings
int main_length=0;
长度上的整数=0;
main_length=strlen(mainstring);//获取mainstring的长度[]
over_length=(main_length-(cstart+clength));//该值必须大于-1且小于主字符串的长度[]
char*result=malloc(clength+1);//通过为终止符添加+1进行初始化\0
//必须等于或大于0且小于主环的最大长度

如果(over_length>=0&&over_length,则无法将数组作为值返回,因为在大多数上下文中,数组会自动衰减到指向其第一个元素的指针。 因此

实际上是

return &result[0];
这是
char*
而不是
char[]

中的答案中描述了一些变通方法。特别是,使用
struct
包装数组的方法非常有趣

顺便说一句,对称地,不可能将数组作为函数参数传递

当你看到

void fun(char arr[N])
它是一种语法糖,用于:

void fun(char *arr)
N
被忽略

有些人认为使用数组参数是一个错误的做法。主要是因为<代码> ARR 不是上下文中的一个数组,即<代码> siZeof(ARR)=siZeof(char)

实际上,使用阵列很困难:

  • 它几乎在任何地方都会衰减到指针
  • 按值传递数组将非常昂贵
  • 指向数组的指针的语法需要非常详细的键入

不,您可以返回包含数组的结构,但不能返回数组。您所说的“直接使用指针”是什么意思?您不能从C中的函数返回数组,也不能将它们作为参数传递-
mainstring
是指针而不是数组,不管它看起来如何。请注意
strcat(result,“\0”);
毫无意义。
strcat()
将在添加内容之前搜索
'\0'
,并且
“\0”
是一个包含零字符串的2元素数组
{'\0','\0'}
(显式编写
\0
加上自动添加的
\0
),因此不会添加任何内容。替换
strcat(结果,“\0”);
带有
结果[clength]='\0';
。可能还值得一提的是,在范围规范无效的情况下,函数仍然返回
结果
,该结果现在指的是已分配但不确定的内存区域,而调用者无法知道哪个是哪个(调用者无法“监视”错误消息由于范围不正确而溢出)。请从开始就终止该区域,或者最好先不分配,然后返回NULL,如果是假的范围,调用方可以测试它。谢谢您的解释,我现在明白了
void fun(char *arr)