C 无超高动态矩阵

C 无超高动态矩阵,c,matrix,dynamic,free,C,Matrix,Dynamic,Free,作为我C语言作业的一部分,我必须制作一个函数,将字符串拆分为所有以插入字母的键开头的单词。 除了自由功能外,其他功能都很好, 当我试图通过函数行然后骨架释放动态矩阵时 我得到一个错误,程序触发了断点 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> char **Split(char *str, char letter, int *size)

作为我C语言作业的一部分,我必须制作一个函数,将字符串拆分为所有以插入字母的键开头的单词。 除了自由功能外,其他功能都很好, 当我试图通过函数行然后骨架释放动态矩阵时 我得到一个错误,程序触发了断点

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char **Split(char *str, char letter, int *size);
void free_mat(char **mat, int size);

int main() {
    int size, i;
    char letter;
    char STR[100];
    char **strings_arr;
    printf("Please enter a string:\n");
    flushall;
    gets(STR);
    printf("Please enter a letter for a check:\n");
    letter = getchar();
    strings_arr = Split(STR, letter, &size);

    if (size > 0) {
        printf("The number of words that starts with the letter '%c' in the string '%s' is: %d\n\n", letter, STR, size);
    }
    printf("The words are:\n");
    for (i = 0; i < size; i++) {
        printf("%d . %s\n", i+1,strings_arr[i]);
    }
    free_mat(strings_arr, size);
    return 0;
}

void free_mat(char **mat, int size)  
{
    int i;
    for (i = 0; i < size; i++)
    {
        free(mat[i]);
    }
    free(mat);
}
char **Split(char *str, char letter, int *size) {
    int rows = 0, i, lengh = 0, j = 0, n = 0, m;
    char **strings_array;

    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) {
        rows++; 
    }
    for (i = 0; str[i] != '\0'; i++) {
         if (str[i] == ' ') {   
            if ((str[i + 1] == letter) || (str[i + 1] == letter + 32) || str[i + 1] == letter - 32) {
                rows++; 
            }
        }
    }
    if (rows == 0) {    
        printf("There are no words starting with '%c' letter in this string\n\n", letter);
    }
    i = 0;
    strings_array = (char*)malloc(rows * sizeof(char)); 
    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) { 
        while (str[i] != ' ' && str[i] != '\0') {
            lengh++;
            i++;
        }
        strings_array[j] = (char*)malloc((lengh + 1) * sizeof(char)); 
        for (n = 0; n < lengh; n++) {
            strings_array[j][n] = str[n];
        }
        strings_array[j][n] = '\0';
        j++;    
    }
    for (i = 1; str[i] != '\0'; i++) {
            if (letter == str[i] || letter == str[i] - 32 || letter == str[i] + 32) {
                lengh = 0;
                //k = 0;
                m = i;  
                while (str[m] != ' ' && str[m] != '\0') {
                    lengh++;
                    m++;
                }
                strings_array[j] = (char*)malloc(lengh + 1);    

                for (n = 0; n < lengh; n++) {
                    strings_array[j][n] = str[i++]; 
                }
                strings_array[j][n] = '\0';
                j++;    
            }
    }
    *size = rows;   // sends back the number of words by referance
    return strings_array;
}

谢谢

断点是您从IDE或等效工具手动插入到代码中的东西。它用于调试。当您运行代码时,它将在到达断点时停止。因此,只要删除断点,它就可以正常工作

注意:仅删除断点。不是那行的代码

您在下面的评论中提到您正在使用Visual Studio 2015。以下是该软件中断点的文档:

但是关于你的代码还有一些其他的东西。首先其次,您似乎发布了错误的版本或其他内容,因为free_mat无法编译。然而,将arr更改为mat很容易解决这一问题


邢在评论中还提到了另一个错误。将strings\u array=char*mallocrows*sizeofchar更改为strings\u array=mallocrows*sizeof*strings\u数组。强制转换是不必要的,您为sizeof的参数选择了错误的类型,如果您传递的是一个取消引用的指针而不是该类型,您将在将来为自己节省很多问题。

@xing,演员阵容是错误的。我改变了这一点,当我试图释放骨架@xingRamp时,它仍然在freemat触发点。你的编译器警告:-Wall-Wextra-Werror@JL2210我在freemat的自由函数中获得触发点。我改变了这一点只是为了帖子,它也不与arr一起工作,我的坏,现在用mat编辑了这篇文章,但仍然不起作用。@R\L如我所说。断点是指您意外或故意插入到该行的内容。你需要移除它。断点与代码无关。我不明白,这一行中的断点我只有freemat,如果我删除它,我就无法释放骨架。@R\L你在用什么程序编写代码?我使用Visual Studio 2015