我用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++;
}
}