C中的子串功能

问题描述

我试图在C语言中实现子字符串功能,这很合逻辑且容易,但是出于某种原因它会打印出符号。与其他人的功能相比,我已经在互联网上进行了多次检查,但是我找不到我的代码无法正常工作的确切原因。

#define MAX 50

char* substring(char string[],int indexBeginning,int indexEnd) {
    const char *result[MAX];
    int n= 0;

    for (int i = indexBeginning; i <= indexEnd; i++) {
        result[n++] = string[i];
    }
    result[n] = '\0';

    return result;
}

解决方法

此数组声明

const char *result[MAX];

不正确。看来你是说

char result[MAX];

但是无论如何您都不能将数组用作返回的表达式

return result;

因为数组是该函数的局部对象,退出该函数后将不活动。

也是这个循环

for (int i = indexBeginning; i <= indexEnd; i++) {
    result[n++] = string[i];
}

不安全,因为没有检查指定的索引对源字符串有效。

函数本身应声明为

char * substring( const char string[],size_t pos,size_t n );

可以通过以下演示程序中所示的以下方式定义该功能。

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

char * substring( const char s[],size_t n )
{
    char *result = NULL;
    
    size_t length = strlen( s );
    if ( pos < length )
    {
        n = n <= length - pos ? n : length - pos;
        
        result = malloc( n + 1 );
        
        if ( result != NULL )
        {
            result[n] = '\0';
            
            memcpy( result,s + pos,n );
        }
    }
    
    return result;
}

int main(void) 
{
    const char *s = "Hello World!";
    
    char *word = substring( s,5 );
    
    if ( word ) puts( word );
    
    free( word );
    
    word = substring( s,6,5 );

    if ( word ) puts( word );
    
    free( word );
    
    return 0;
}

程序输出为

Hello
World