我正在开发一个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)) {

09-06 19:38