在我目前正在编写的程序中,我有这个函数,它读取输入并将每一行存储在字符数组的条目中。n
是先前在输入中给出的数字,表示要读取的行数。
char **linelist(int n)
{
int i, j;
char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}
for (i = 0; i < n; i++){
fgets(list[i], (MAX_STR), stdin);
}
return list;
}
此功能似乎工作正常,因为某个命令的输出应该将输入作为输出始终与测试中的假定输出匹配。
然后,我们有下面的函数,它取前面提到的返回的数组,将行进一步拆分为单词,生成一个二维矩阵,其中有n
行,对应于输入中的行数,因此,他们的中的数字list
和任意数量的行,每行的单词存储在每个条目中。
char ***createmat(int n, char **list)
{
char ***matrix;
int i, x, j, k, l, y, z;
char *buffer;
const char separators[] = {' ','\t',',',';','.','?','!','"','\n'};
printf("F0\n");
buffer = calloc(MAX_STR, sizeof(char));
y = 0;
matrix = calloc(n, sizeof(char**));
for(z = 0; z < n; z++) {
matrix[z] = calloc(n, sizeof(char*)); // line 100
for(i = 0; i < n; i++) {
matrix[z][i] = calloc(MAX_STR, sizeof(char));
}
}
printf("F1\n");
for(x = 0; x < n; x++){
for(j = 0, l = 0; list[x][j] != '\0'; j++, l++){
buffer[l] = tolower(list[x][j]);
for(k = 0; k < 9; k++){
if(list[x][j] == separators[k]){
if(l != 0){
buffer[l] = '\0';
printf("F2\n");
stringcpy(buffer,matrix[x][y++]); //line 114
printf("F3\n");
}
l = -1;
}
}
}
matrix[x][y+1] = "\n";
}
printf("F4\n");
return matrix;
}
这是一个函数,它从为 分配内存开始matrix
,这个过程在 Valgrind 中不会引发错误。问题似乎与应该分离和存储单词的部分有关。根据测试,当每行只有一个单词时,它似乎有效,但当任何一行有多个单词时,它不起作用。这些printf
语句用于调试目的并在终端中运行以下输入:
3 //what the functions receive as int n - the number of lines
the sky
is pink and yellow and
not uncute
给出以下输出:
F0
F1
F2
F3
F2
F3
F2
F3
F2
Segmentation fault (core dumped)
至于在 Valgrind 中运行它返回以下内容:
==7599== Invalid read of size 8
==7599== at 0x400D01: createmat (proj.c:114)
==7599== by 0x4015A7: main (proj.c:241)
==7599== Address 0x5201428 is 0 bytes after a block of size 72 alloc'd
==7599== at 0x4C2ABB4: calloc (vg_replace_malloc.c:593)
==7599== by 0x400BBC: createmat (proj.c:100)
==7599== by 0x4015A7: main (proj.c:241)
==7599==
==7599== Invalid read of size 1
==7599== at 0x40087D: stringcpy (proj.c:12)
==7599== by 0x400D16: createmat (proj.c:114)
==7599== by 0x4015A7: main (proj.c:241)
==7599== Address 0x0 is not stack'd, malloc'd or (recently) free'd
stringcpy
功能如下:
void stringcpy(char *s, char *t)
{
while ((*s++ = *t++) != '\0'); //line 12
}
我一直在试图找出问题所在,但无济于事,因为我在 C 方面的经验很少。任何帮助将不胜感激。谢谢你。