我正在开发一个C项目,它将根据用户指定的每行字符数缩进一行。我很难选择下一行什么时候开始,因为它不能在两行之间分开一个字。
其工作方式如下
1)使用wordPerLine检查行中可以插入的单词数,给它一份列表副本
2)添加单词,直到达到该行的最大单词数
3)达到最大字数后,开始新的一行并继续,直到到达列表的末尾。
它的意思是“段故障(核心转储)”。如果你能帮助我,我将非常感激。
这是我的每行字函数:
int wordPerLine(int size,LISTNODEPTR temp){
int chars=0;
int words=0;
int spaces=0;
while(temp!=NULL && (chars+spaces)<size){
if(!isspace(temp->data)) {
chars++;
temp=temp->nextPtr;
} else {
words++;
chars++;
spaces=words-1;
temp=temp->nextPtr;
}
}
return words;
}
我的列表结构:
struct listNode { /* self-referential structure */
char data;
struct listNode *nextPtr;
};
还有打印功能
void printList(LISTNODEPTR currentPtr, int spaces)
{
//Temp variable to avoid moving the actual pointer in the length function
LISTNODEPTR temp = currentPtr;
int x=0;
int remaining=0;
int chars=0;
int wordsAvail=0;
int wordsUsed=0;
if (currentPtr == NULL)
printf("Empty String.\n\n");
else {
//Checks if the list is at the end and exits if TRUE
while(currentPtr!=NULL){
wordsAvail=wordsPerLine(spaces,temp);
for(wordsUsed=0; wordsUsed<=wordsAvail;wordsUsed++) {
while(!isspace(currentPtr->data)&& currentPtr!=NULL) {
printf("%c",currentPtr->data);
currentPtr=currentPtr->nextPtr;
temp=currentPtr;
}
wordsUsed++;
printf(" ");
while(isspace(currentPtr->data)&& currentPtr!=NULL) {
currentPtr=currentPtr->nextPtr;
temp=currentPtr;
}
}
}
}
}
最佳答案
段故障(堆芯转储)
表示您试图读取程序分配的RAM之外的内存。这通常意味着您的程序中有一个指针,该指针已初始化(或未初始化)到程序分配的RAM之外的某个值,并且您已取消对该指针的引用(请求指针存储地址处的值)。
你的程序很少有指针。让我们看看他们
currentPointer
用于
while(!isspace(currentPtr->data)&& currentPtr!=NULL) {
它检查它是否
NULL
,但仅在它尝试获取数据并将其传递给isspace(...)
之后。我想在试图取消引用currentpr之前,您可能需要检查它是否
NULL
,如下所示while(currentPtr!=NUll && !isspace(currentPtr->data)) {