C 无超高动态矩阵
作为我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)
#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