while()跳出循环后直接终止程序?

我做的是一个项目管理系统,在按编号删除的时候,我是想如果查不到匹配的编号,就进行模糊搜索。but,当我键入其中一个编号的子串时,按理跳出了循环(确实也跳出了),不过是跳出就直接终止了程序,就是说我后面的代码都没运行呢!


```c
void del(struct Node* list){
    int i;
    char id1[8];
    printf("请输入您想要删除的项目编号(格式:字母+6个数字):\n");
    scanf("%s",id1);
//    getchar();
//    for(i=0;i<7;i++){
//        scanf("%c",&id1[i]);
//    }
//    id1[7]='\0';
    printf("再次确认你所要删除的项目编号是:");
    puts(id1);
    struct Node* pos;
    struct Node* p; 
    pos=list;
    if(list->next==NULL){
        printf("\n链表为空!\n");
        return;
    } 
    else{
        while(strcmp(id1,pos->next->data.id)!=0){
            if(pos->next==NULL){
                break;
            } 
            printf("xixi\n");
            pos=pos->next;
        }
        printf("你怎么不执行这一步??\n");
        p=pos;
        printf("??\n");
        if(strcmp(id1,pos->next->data.id)==0&&pos->next!=NULL){
            printf("\n\t你删除的项目信息为: \n");
            printf("\t项目名称:%s\n",pos->next->data.name );
            printf("\t项目类别:%s\n",pos->next->data.category);
            printf("\t项目编号:");
            for(i=0;i<7;i++){
                printf("%c",pos->next->data.id[i]);
            }
            printf("\n");
//            puts(pos->data.id);
            printf("\t负责人:%s\n",pos->next->data.head);
            printf("\t指导老师:%s\n",pos->next->data.teacher);
            printf("\t成员:");
//            puts(pos->data.players);
            printf("%s\n",pos->next->data.players);
            printf("\t总人数: %d\n",pos->next->data.number);
            p->next=pos->next->next;
            free(pos->next);
            getchar();    
            printf("删除成功!\n");
        }
        else{
            printf("\t没有找到输入的编号信息!\n");
            printf("正在进行模糊搜索......\n");
            printf("模糊搜索找到的信息如下:\n"); 
        }
    }
    return;
}  

运行结果是这样的:

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/079742970546151.png "#left")



咋办?

你这个应该不是正常通过break跳出循环,应该是出异常程序直接中断了

 while(strcmp(id1,pos->next->data.id)!=0){
            if(pos->next==NULL){  /*当此步判空前,已经在while的条件里使用了"pos->next->data.id"来做判断,应该pos指针移动后先判断再使用*/
                break;
            } 
            printf("xixi\n");
            pos=pos->next;
}

修改为如下:

 while(pos->next!=NULL && strcmp(id1,pos->next->data.id)!=0){  /*将"pos->next!=NULL"置于strcmp函数判断之前,若pos->next==NULL时"&&"运算符可以短路掉不执行strcmp函数*/
            printf("xixi\n");
            pos=pos->next;
}