我正在尝试编写一个函数来过滤 C 中字符串中的非字母字符。
因此,在函数“wordFilter”中,我初始化了一个 char 数组,以便存储过滤后的字符串,然后将其分配给指针,以便我可以返回它。
然而,事实证明,每当该函数在第一次执行后,字符数组“引用”似乎仍然保留上次执行完成时的值。有没有办法让“引用”数组每次在函数执行开始时都为空。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *wordFilter(char *string){
char reference[strlen(string)];
int index = 0;
while(*string){
if (isalpha(*string)){
reference[index] = *string;
index++;
}
string++;
}
char *ptr = malloc(sizeof(char)*index);
ptr = reference;
return ptr;
}
int main(){
char input[256];
char *ptr = input;
char input2[256];
fgets(input, 256, stdin);
char reference[256];
for (int pos = 0; sscanf(ptr, "%s%n", input2, &pos) == 1; ptr+=pos){
printf("%s ", wordFilter(input2));
}
return 0;
}
主要问题是这一行:
ptr = reference;
这不会将 reference
的字符复制到 ptr
中。正如 Eugene 指出的,该行导致变量 ptr
指向堆栈分配的 reference
数组,泄漏您 malloc
ed 的内存。
以下是我建议的更改:
reference
一样分配char reference[strlen(string) + 1];
,为终止空值留出空间。while
循环之后,以空终止 reference
,如下所示: reference[index] = '\0';
malloc
并复制字符串,而是使用 strdup(reference)
来堆分配 reference
的副本,然后您可以返回从 strdup
中获得的内容。