基于用户输入的每行C字符缩进

基于用户输入的每行C字符缩进,c,linked-list,counter,C,Linked List,Counter,我正在从事一个C项目,该项目将根据用户指定的每行字符数缩进一行。我很难选择何时开始下一行,因为它无法在两行之间拆分一个单词。 其工作方式如下所示 1) 使用wordPerLine检查可以进入该行的单词数,并提供列表的副本 2) 添加单词,直到达到该行的最大单词数 3) 达到最大字数后,开始新行并继续,直到到达列表末尾 它的意思是“段故障(堆芯倾倒)”。如果你能给我任何帮助,我将非常感激 这是我的逐行文字功能: int wordPerLine(int size,LISTNODEPTR temp

我正在从事一个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;
}
还有打印功能,我想把所有的东西都放在一起

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;
           }  
        }
     }
   }
}
void打印列表(LISTNODEPTR currentPtr,int空格)
{
//Temp变量,以避免在长度函数中移动实际指针
LISTNODEPTR温度=当前ptr;
int x=0;
剩余整数=0;
int chars=0;
int-wordsAvail=0;
int-wordsUsed=0;
如果(currentPtr==NULL)
printf(“空字符串。\n\n”);
否则{
//检查列表是否在末尾,如果为TRUE,则退出
while(currentPtr!=NULL){
wordsAvail=wordsPerLine(空格、温度);
for(wordsUsed=0;wordsUseddata)&¤tPtr!=NULL){
printf(“%c”,currentPtr->data);
currentPtr=currentPtr->nextPtr;
温度=电流ptr;
}
wordsUsed++;
printf(“”);
while(isspace(currentPtr->data)&¤tPtr!=NULL){
currentPtr=currentPtr->nextPtr;
温度=电流ptr;
}  
}
}
}
}
段故障(堆芯转储)

表示您试图读取程序分配RAM之外的内存。这通常意味着您的程序中有一个指针,该指针已初始化(或未初始化)到程序分配的RAM之外的值,并且您已解除对该值的引用(请求指针存储地址处的值)

你的程序几乎没有指针。让我们看看

currentPointer
用于

while(!isspace(currentPtr->data)&& currentPtr!=NULL) {
它会检查它是否为
NULL
,但只有在它尝试获取数据并将其传递给
isspace(…)
之后才会进行检查

我想在尝试取消引用之前,您可能需要检查currentPtr是否为
NULL
,就像这样

while(currentPtr!=NUll && !isspace(currentPtr->data)) {
段故障(堆芯转储)

表示您试图读取程序分配RAM之外的内存。这通常意味着您的程序中有一个指针,该指针已初始化(或未初始化)到程序分配的RAM之外的值,并且您已解除对该值的引用(请求指针存储地址处的值)

你的程序几乎没有指针。让我们看看

currentPointer
用于

while(!isspace(currentPtr->data)&& currentPtr!=NULL) {
它会检查它是否为
NULL
,但只有在它尝试获取数据并将其传递给
isspace(…)
之后才会进行检查

我想在尝试取消引用之前,您可能需要检查currentPtr是否为
NULL
,就像这样

while(currentPtr!=NUll && !isspace(currentPtr->data)) {

通常,它会帮助您了解如何使用核心转储。转储将告诉您分段错误发生的位置。你的调试器将成为你最好的朋友。:-)在这种情况下,我注意到您在打印功能中设置了
中的
currentPtr
!isspace
while循环,然后在该循环之外,使用
currentPtr
而不确定它是否为空。您的问题可能会出现在行
上,而(isspace(currentPtr->data))
为“行中的字符”使用链接列表太复杂了。想想一条线能有多长?假设行的长度不能超过1000个字符,那么
字符行[1000]
只能容纳行。这样的阵列将更加有效。分析数据记录:技术
nextPtr
只保存结构信息。在64位计算机上,列表记录中的信息/总数据大小至少为(无内存对齐)1/9。这是非常糟糕的,在现实世界中甚至更糟。我使用的是一个没有调试器的在线IDE:(但我在行中添加了一个空检查,它仍然会给我错误。我更新了代码以反映这一点。通常,它会帮助您了解如何使用核心转储。转储将告诉您分段错误发生的位置。您的调试器将成为您最好的朋友。:-)在这种情况下,我注意到在打印函数中,您在
!isspace
while循环中设置了
currentPtr
,然后在该循环之外,您使用
currentPtr
而不确定它是否为空。您的问题可能会出现在
while(isspace(currentPtr->data))
行上,使用“一行中的字符”太复杂了。想想一行可以有多长?假设行不能超过1000个字符,那么
字符行[1000]
只保留行。这样的数组会更有效。分析数据记录:技术
nextPtr
只保留结构信息。在64位机器上,列表记录中的信息/总数据大小至少为(无内存对齐)1/9.这非常糟糕,在现实世界中甚至更糟。我正在使用一个没有调试器的在线IDE:(但是我在行中添加了一个空检查,它仍然会给我错误。我更新了代码以反映这一点。