我尝试将一个字符串分割成三元组字符串。但结果是生成的子字符串总是混乱的。需要输入长度和字符**类型,因为后面我会将它们用作Python调用该函数的参数。
这是我编写的函数。
在Win10操作系统下,使用Codeblocks 17.12和GCC 8.1.0。
struct strArrIntArr getSearchArr(char* input, int length) {
struct strArrIntArr nameIndArr;
// flag of same bit
int same;
// flag/index of identical strings
int flag = 0;
// how many identical strings
int num = 0;
// array of split strings
char** nameArr = (char **)malloc(sizeof(char *) * (length - 2));
if ( nameArr == NULL ) exit(0);
// numbers of every split string
int* valueArr = (int* )malloc(sizeof(int) * (length-2));
if ( valueArr == NULL ) exit(0);
// loop length of search string -2 times (3-gram)
for(int i = 0; i<length-2; i++){
if(flag==0){
nameArr[i - num] = (char *)malloc(sizeof(char) * 3);
if ( nameArr[i - num] == NULL ) exit(0);
printf("----i------------%d------\n", i);
printf("----i-num--------%d------\n", i-num);
}
flag = 0;
// compare splitting string with existing split strings,
// if a string exists, it would not be stored
for(int k=0; k<i-num; k++){
same = 0;
for(int j=0; j<3; j++){
if(input[i + j] == nameArr[k][j]){
same ++;
}
}
// identical strings found, if all the three bits are the same
if(same == 3){
flag = k;
num++;
break;
}
}
// if the current split string doesn't exist yet
// put current split string to array
if(flag == 0){
for(int j=0; j<3; j++){
nameArr[i-num][j] = input[i + j];
valueArr[i-num] = 1;
}
}else{
valueArr[flag]++;
}
printf("-----string----%s\n", nameArr[i-num]);
}
// number of N-gram strings
nameIndArr.length = length- 2- num;
// array of N-gram strings
nameIndArr.charArr = nameArr;
nameIndArr.intArr = valueArr;
return nameIndArr;
}
调用函数的方法:
int main(int argc, const char * argv[]) {
int length = 30;
char* input = (char *)malloc(sizeof(char) * length);
input = "googleapis.com.wncln.wncln.org";
// split the search string into N-gram strings
// and count the numbers of every split string
struct strArrIntArr nameIndArr = getSearchArr(input, length);
}
以下是结果。从17开始的字符串很混乱。
----i------------0------
----i-num--------0------
-----string----goo
----i------------1------
----i-num--------1------
-----string----oog
----i------------2------
----i-num--------2------
-----string----ogl
----i------------3------
----i-num--------3------
-----string----gle
----i------------4------
----i-num--------4------
-----string----lea
----i------------5------
----i-num--------5------
-----string----eap
----i------------6------
----i-num--------6------
-----string----api
----i------------7------
----i-num--------7------
-----string----pis
----i------------8------
----i-num--------8------
-----string----is.
----i------------9------
----i-num--------9------
-----string----s.c
----i------------10------
----i-num--------10------
-----string----.co
----i------------11------
----i-num--------11------
-----string----com
----i------------12------
----i-num--------12------
-----string----om.
----i------------13------
----i-num--------13------
-----string----m.w
----i------------14------
----i-num--------14------
-----string----.wn
----i------------15------
----i-num--------15------
-----string----wnc
---i------------16------
----i-num--------16------
-----string----ncl
----i------------17------
----i-num--------17------
-----string----clnsole
----i------------18------
----i-num--------18------
-----string----ln.=C:
----i------------19------
----i-num--------19------
-----string----n.wgram 馻绚s
----i------------20------
----i-num--------20------
-----string----n.wgram 馻绚s
-----string----n.wgram 馻绚s
-----string----n.wgram 馻绚s
-----string----n.wgram 馻绚s
-----string----n.wgram 馻绚s
-----string----n.oiles(騛窑=
----i------------26------
----i-num--------21------
-----string----.orSModu鯽蓼t
----i------------27------
----i-num--------22------
-----string----org
在Win10操作系统下,使用Codeblocks 17.12和GCC 8.1.0。
%.3s
进行打印,要么在字符串中包含空格和终止零字符。 - KamilCukinput="googleapis.com.wncln.wncln.org"
将导致内存泄漏。由于此字符串长度为30个字符,因此必须增加缓冲区大小以使用strcpy()
。(您还必须为终止的空字符分配空间。)或者,可以仅删除malloc()
,因为该字符串似乎没有被修改。(不能修改字符串常量。) - MikeCATnameArr[i - num] = (char *)malloc(sizeof(char) * 3);
中使用未初始化的自动变量num
,导致您正在调用未定义行为(这不应该是原因,因为首先将打印0
作为i - num
)。 - MikeCATflag == 0
无法区分“未找到匹配项”和“与第一个字符串匹配”。 - MikeCATvalgrind
运行您的程序显示它在printf("-----string----%s\n", nameArr[i]);
访问未初始化的内存,即使已经初始化了num=0
。显然,在某些情况下,您没有填充(或分配?)nameArr[i]
。赋值语句input = "googleapis.com.wncln.wncln.org";
并不会复制字符串,而是用您字符串字面量的地址覆盖指针。我建议使用int length; char* input = strdup("googleapis.com.wncln.wncln.org"); length = strlen(input);
。 - Bodo