我正在try 用C语言编写一个函数来过滤字符串中的非字母字符.

所以在函数wordFilter中,我初始化了一个char数组,以便在那里存储过滤后的字符串,然后将其赋给指针,这样我就可以返回它.

然而,事实证明,每当函数在第一次执行后执行时,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使用的内存.

以下是我建议的改变:

  1. char reference[strlen(string) + 1];一样分配reference,以便为终止空值留出空间.
  2. while循环之后,将reference作为空终止,如下所示:reference[index] = '\0';
  3. 不使用malloc并复制字符串,而是使用strdup(reference)堆分配reference的副本,然后您可以返回从strdup获得的内容.

C++相关问答推荐

变量的const视图是否定义良好?

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

GCC不警告隐式指针到整数转换'

InetPton()函数无效的IP地址

编译SDL 2时缺少SDL_ttf

如何将已分配的数组(运行时已知的大小)放入 struct 中?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

如何将常量char*复制到char数组

在句子中转换单词的问题

在移动数组元素时获得意外输出

C中的FREE函数正在触发断点

不同出处的指针可以相等吗?

我在C中运行和调试时得到了不同的输出

如何修复我的qsort()算法?它每次都给出不同的结果

C23标准是否向后兼容?

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

C:面筋蛋白';为什么不刷新窗口?

这些表达式是否涉及 C 中定义的复合文字?

通过修改c中的合并排序对数组的偶数索引进行排序

在带中断的循环缓冲区中使用 易失性