我遇到了一个未识别的分段故障。
我的错误函数接收到一个字符串 '.'这是我代码的相关部分: 经过调试,我知道时程序崩溃了 w=1在 我不知道为什么会发生这种事。在执行该语句之前,我检查了p、s、w和c的值,以及realloc语句是否正确执行。 但徒劳无功! 我的代码中可能出了什么问题?text
。它应该将其转换为document
并返回。document
由paragraphs
(用'\n'分隔(组成,CCD_4由sentences
(用char**** get_document(char* text) {
int p = 0, s = 0, w = 0, c = 0;
char**** document;
document = malloc(sizeof(char***));
document[0] = malloc(sizeof(char**));
document[0][0] = malloc(sizeof(char*));
document[0][0][0] = malloc(sizeof(char));
while (*text)
{
if (*text == ' ')
{
c = 0;
++w;
document[p][s] = realloc(document[p][s], sizeof(char*) * (w + 1));
}
else if (*text == '.')
{
c = 0;
w = 0;
++s;
document[p] = realloc(document[p], sizeof(char**) * (s + 1));
}
else if (*text == 'n')
{
c = 0;
w = 0;
s = 0;
++p;
document = realloc(document, sizeof(char***) * (p + 1));
}
else
{
++c;
document[p][s][w] = realloc(document[p][s][w], sizeof(char) * (c + 1));
document[p][s][w][c - 1] = *text;
document[p][s][w][c] = ' ';
}
++text;
}
return document;
}
document[p][s][w][c - 1] = *text;
您需要为新的段落、句子和单词分配内存。通过重新分配,您增加了实际的维度大小,但新元素是一个导致segfault的空指针。
char**** get_document(char* text) {
int p = 0, s = 0, w = 0, c = 0;
char**** document;
document = malloc(sizeof(char***));
document[0] = malloc(sizeof(char**));
document[0][0] = malloc(sizeof(char*));
document[0][0][0] = malloc(sizeof(char));
while (*text)
{
if (*text == ' ')
{
c = 0;
++w;
document[p][s] = realloc(document[p][s], sizeof(char**) * (w + 1));
document[p][s][w] = malloc(sizeof(char*));
}
else if (*text == '.')
{
c = 0;
w = 0;
++s;
document[p] = realloc(document[p], sizeof(char**) * (s + 1));
document[p][s] = malloc(sizeof(char**));
document[p][s][w] = malloc(sizeof(char*));
}
else if (*text == 'n')
{
c = 0;
w = 0;
s = 0;
++p;
document = realloc(document, sizeof(char****) * (p + 1));
document[p] = malloc(sizeof(char***));
document[p][s] = malloc(sizeof(char**));
document[p][s][w] = malloc(sizeof(char*));
}
else
{
++c;
document[p][s][w] = realloc(document[p][s][w], sizeof(char) * (c + 1));
document[p][s][w][c - 1] = *text;
document[p][s][w][c] = ' ';
}
++text;
}
return document;
}
此外,你的打印方法基本上不起作用,因为你没有节省空间(无论如何你都不需要(。所以,我修复了它:
int main()
{
char* text = "New word.No space before a sentence.nThis is a new paragraph.";
char**** doc = get_document(text);
int p = 0, s = 0, w = 0, c = 0;
char ch;
while (ch = *text)
{
if (ch == ' ')
{
putchar(' ');
c = 0;
++w;
}
else if (ch == '.')
{
putchar('.');
c = 0;
w = 0;
++s;
}
else if (ch == 'n')
{
putchar('n');
c = 0;
w = 0;
s = 0;
++p;
}
else putchar(doc[p][s][w][c++]);;
text++;
}
return 0;
}
输出似乎正确:
新词。句子前没有空格
这是一个新段落
我认为你不必释放doc
,因为你是在它之后从主屏幕返回的,如果需要,Hackerrank会处理它。但请注意,否则你应该好好处理它。