什么错误的打印字符*从函数返回?

时间:2017-04-15 18:31:28

标签: c linux pointers char

我已经构建了一个函数,用于搜索源字符串中的子字符串,并使用找到它的子字符串的索引填充数组。

我调试它并使用正确的索引填充索引数组但是当我返回指针并尝试打印它时,只是得到空白

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

#define AUX_LENGTH 1000

char* find_sub_string(char *source,char *sub_string);

int main()
{
    char text[]="yesterday i was walking";
    char find[]="e";

    printf("%s \n",find_sub_string(text,find));

    return 0;
}

/*!
 *Function to find the index of a substring in a source string
 @param *source string source to search
 @param *sub_string substring to find
 @return result returns the indexs of the found subtring
 @return NULL in case not found or subtring bigest than source string
*/

char* find_sub_string(char *source,char *sub_string)
{
    size_t l_source=strlen(source);
    size_t l_sub_string=strlen(sub_string);

    if(l_sub_string>l_source)
        return NULL;

    char aux[AUX_LENGTH]="";
    static char result[AUX_LENGTH];

    int i,j;

    for(i=0,j=0; i<l_source;i++)
    {
        memcpy(aux,source+i,l_sub_string);
        if (memcmp(aux,sub_string,l_sub_string)==0)
        {
            result[j++]=i+1;
        }
    }
    result[j]='\0';

    if (j>0)
        return result;
    else
        return NULL;
}

编辑:示例

char text[]="yesterday i was walking";
char find[]="e";
char *p=find_sub_string(text,find);

* p必须是一个指针char arra,其中包含所建立位置的索引,如下所示:* p = {&#34; 25&#34;}两个和五个是&#34; e&#34;的位置。我的来源。

编辑2 我将代码更改为size_t数组更容易处理没有ASCII转换,我可以使用strstsr但我必须嵌入anohter函数因为我想搜索所有的字符串,而不是只保留第一个数学。

这里的新代码感谢您的评论,我可以通过strstr改进一些事情:

size_t* find_sub_string(char *source,char *sub_string)
{
    size_t l_source=strlen(source);
    size_t l_sub_string=strlen(sub_string);

    if(l_sub_string>l_source)
        return NULL;

    size_t *result = malloc(sizeof(size_t)*AUX_LENGTH);

    size_t i,j;

    for(i=0,j=0; i<l_source;i++)
    {
        if (memcmp(source+i,sub_string,l_sub_string)==0)
        {
            result[j++]=i+1;
        }
    }
    result[j]='\0';

    if (j>0)
        return result;
    else
        return NULL;
}

int main()
{
    char text[]="yesterday i was walking";
    char find[]="y";
    size_t *p=find_sub_string(text,find);
    printf("%lu \n",p[0]);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

strstr这样的子字符串查找函数背后的想法是返回字符串中子字符串的实际位置。 在您的实现中,您实际上将子字符串复制到结果中。它几乎不值得搜索。

此实现返回实际位置或NULL。

char *find_sub_string(char *source, char *sub_string)
{
    size_t l_source=strlen(source);
    size_t l_sub_string=strlen(sub_string);
    int i,j;

    if (l_sub_string>l_source)
        return NULL;

    for (i=0,j=0; i<l_source-l_sub_string;i++)
    {
        if (memcmp(source+i,sub_string,l_sub_string)==0)
            return source+i
    }

    return NULL;
}