c-为什么继续导致未定义的行为



我用C语言创建了一个程序,从文件中读取单词并将其存储到链表中,但我注意到第二个continue会导致未定义的行为为什么会发生这种情况?

有3个功能

第一个功能创建一个列表,该列表是精细的

第二个函数用数据填充列表

第三个显示列表的内容

当我运行程序时,调用未定义的行为

文件:https://gist.github.com/up1047388/b3018bc2a1fb0d66e86855a0d54baf63

我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node {
char str[50];
struct node *next;
}Node;

void createList(Node ** head , int len )
{   int i=0;
Node **lpp ;
Node *komvos ;
Node *komvos1;
komvos = (Node*)malloc(sizeof(Node));
komvos -> next = NULL;
lpp=&komvos;
for(i=1 ; i < len ; i++)
{
komvos1 = (Node*)malloc(sizeof(Node));
komvos1 -> next = NULL;
(*lpp) -> next = komvos1;
lpp = &(*lpp) -> next;
}

*head = komvos ;
}

void FileList(FILE *fp  , Node *head) 
{   char c;
char tempStr[50];
char str[50];
int i = 0 , j = 0;
Node **lpp;
lpp=&head;

for(c=fgetc(fp) ; c!=EOF ; c=fgetc(fp))
{
str[j]=c;
j++;
}   
str[j]='';    
j=0;    

while(str[j]!='')  
{   

if (str[j] == ' ')
{
if (i == 0)
{
continue;
}

tempStr[i] = '';
i = 0;


strcpy((*lpp) -> str , tempStr);

lpp = &(*lpp)  -> next ;       

//continue  //This continue caused the problem
}

tempStr[i] = str[j];
i++;
j++;


}   

}

void printList(Node *head)
{
Node *temp;
temp = head;
for(;temp!=NULL;temp=temp->next)
{
printf("nthe words are  : %s", temp -> str);
}

}


int main ()
{   

Node *head ;
head = NULL;
FILE *fp;
fp = fopen ("lists4.txt","r+");
if (fp==NULL)
{
printf("the file is broken");
exit(8);
}

createList(&head , 3);
FileList(fp,head);
printList(head);

return 0;
}

注释掉的continue将使循环无限运行,因为它阻止了j的更新。

为了避免这种情况,在str[j] == ' '的情况下,请在continue之前添加用于更新j的代码。

while(str[j]!='')
{

if (str[j] == ' ')
{
j++; /* add this to update j */
if (i == 0)
{
continue;
}

tempStr[i] = '';
i = 0;

strcpy((*lpp) -> str , tempStr);

lpp = &(*lpp)  -> next ;

continue;  /* and then turn on the continue */
}

tempStr[i] = str[j];
i++;
j++;

}

在这种情况下,我更喜欢使用if-else

while(str[j]!='')
{

if (str[j] == ' ')
{
j++;
if (i == 0)
{
continue;
}

tempStr[i] = '';
i = 0;

strcpy((*lpp) -> str , tempStr);

lpp = &(*lpp)  -> next ;
}
else
{
tempStr[i] = str[j];
i++;
j++;
}

}

相关内容

  • 没有找到相关文章

最新更新