【问题标题】:What's wrong cant print char* returned from function?有什么问题不能打印从函数返回的 char*?
【发布时间】:2017-04-15 18:31:27
【问题描述】:

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

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

#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={"25"} 2 和 5 是源中 "e" 的位置。

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

这里的新代码感谢 cmets 我可以改进一些我将用 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;
}

【问题讨论】:

  • 你为什么要在char数组中存储索引?为什么不intsize_t
  • result 由一些与字符串没有太大关系的整数组成。
  • 此外,返回对静态数组的引用通常不是一个好主意。对相同函数的其他调用可能会更改数据。
  • 一个大问题是你试图 printf 不能用 %s 打印——要么是 NULL,要么是一堆 1 字节整数。
  • 我也看不出你为什么要复制到aux——你可以直接对source+i进行memcmp。

标签: c linux pointers char


【解决方案1】:

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;
}

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2015-03-13
    • 2021-12-30
    • 2018-02-19
    • 2016-05-06
    相关资源
    最近更新 更多