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