C用户输入和链接列表

C用户输入和链接列表,c,linked-list,stdin,fgets,C,Linked List,Stdin,Fgets,我试图从用户输入中获取一个字符串,然后将其与我之前在代码中创建的链表进行比较,并找到该字符串应该插入的位置。当用户不输入任何内容并按enter键时,停止循环 我能够接收字符串并找到要插入的位置,但我要做的是循环,直到用户输入空白输入。这导致我的代码在某个地方被破坏,我不太清楚为什么。我已经在我的代码中插入了断点来调试它,但我相信我对FGET有问题。任何帮助都将是惊人的 当我说代码“中断”时,输出是这样的: BREAK1: AAAA BREAK2 BREAK4 AA

我试图从用户输入中获取一个字符串,然后将其与我之前在代码中创建的链表进行比较,并找到该字符串应该插入的位置。当用户不输入任何内容并按enter键时,停止循环

我能够接收字符串并找到要插入的位置,但我要做的是循环,直到用户输入空白输入。这导致我的代码在某个地方被破坏,我不太清楚为什么。我已经在我的代码中插入了断点来调试它,但我相信我对FGET有问题。任何帮助都将是惊人的

当我说代码“中断”时,输出是这样的:

BREAK1: AAAA

BREAK2
BREAK4
               AAAA
   0
BREAK5
字符串和位置是正确的,但它正在多行打印,然后在此之后,它继续循环而不重置。下面是我的代码:

// NO FILE, SO INTAKE STRINGS
///////////////////////////////////////////////////
///////////////////////////////////////////////////
else{
    fgets(buff,BUFF_SIZE,stdin);
    buff[strlen(buff)] = '\0';

    while (buff[0] != '\0'){
        printf("BREAK1: %s\n", buff);
        // set curr = root node
        curr = root;
        printf("BREAK2\n");
        while (curr->next){
            if (strcmp(buff, curr->stringDat) == 1){
                insertPnt++;
                curr = curr->next;
                printf("BREAK3\n");
            }
            else{
                printf("BREAK4\n");
                insert(buff, insertPnt, root);
                printf("%20s   %d\n", buff, insertPnt);
                break;
            }
        }

        // clear buffer
        for (i = 0; i < BUFF_SIZE; i++) {
            buff[i] = 0;
        }
        printf("BREAK5\n");
        // user input
        fgets(buff, BUFF_SIZE, stdin);
        buff[strlen(buff)] = '\0';
        printf("BREAK6\n");
    }
}
//没有文件,所以输入字符串
///////////////////////////////////////////////////
///////////////////////////////////////////////////
否则{
fgets(浅黄色、浅黄色尺寸、标准尺寸);
buff[strlen(buff)]='\0';
而(buff[0]!='\0'){
printf(“BREAK1:%s\n”,buff);
//set curr=根节点
curr=根;
printf(“BREAK2\n”);
while(当前->下一步){
如果(strcmp(buff,curr->stringDat)==1){
insertPnt++;
当前=当前->下一步;
printf(“BREAK3\n”);
}
否则{
printf(“BREAK4\n”);
插入(buff、insertPnt、root);
printf(“%20s%d\n”,buff,insertPnt);
打破
}
}
//清除缓冲区
对于(i=0;i
****更新的代码(在空白输入时仍不停止)****

else{
while(fgets(buff,buff_SIZE,stdin)!=NULL){
buff[strlen(buff)-1]='\0';
insertPnt=1;
printf(“BREAK1:%s\n”,buff);
//set curr=根节点
curr=根;
printf(“BREAK2\n”);
while(当前->下一步){
如果(strcmp(buff,curr->stringDat)>0){
insertPnt++;
当前=当前->下一步;
}
否则{
插入(buff、insertPnt、root);
printf(“%-20s%d\n”,浅黄色,插入pnt);
//打印链接列表
打印(根);
打破
}
}
//清除缓冲区
对于(i=0;i
字符串和位置正确,但正在打印 多行

因为您没有剥离
fgets
留下的尾随新行:

fgets(buff,BUFF_SIZE,stdin);
buff[strlen(buff)] = '\0'; /* This is a NO-OP */
改为

char *ptr;
fgets(buff,BUFF_SIZE,stdin);
if (ptr = strchr(buff, '\n')) {
    *ptr = '\0';
}
字符串和位置正确,但正在打印 多行

因为您没有剥离
fgets
留下的尾随新行:

fgets(buff,BUFF_SIZE,stdin);
buff[strlen(buff)] = '\0'; /* This is a NO-OP */
改为

char *ptr;
fgets(buff,BUFF_SIZE,stdin);
if (ptr = strchr(buff, '\n')) {
    *ptr = '\0';
}

可能和你的问题有关。。。在
fgets
调用之后,
buff[strlen(buff)]
已经等于字符串终止符。如果要删除可能的尾随换行符,应使用
buff[strlen(buff)-1]='\0'
。顺便说一下,查看
fgets
是否成功的正确方法是检查它是否返回
NULL
。因此,通常会使用像
while(fgets(…)!=NULL)
这样的循环。在文档中,是什么让您相信它将可预测地返回
1
,特别是在测试
if(strcmp(buff,curr->stringDat)==1)
?@WhozCraig,很好,我将我的代码更改为>0…谢谢你指出这一点。@Someprogrammerdude确实提供了帮助,我现在唯一的问题是输入一个空白字符串并没有停止循环…请参阅上面更新的代码,可能与你的问题有关。。。在
fgets
调用之后,
buff[strlen(buff)]
已经等于字符串终止符。如果要删除可能的尾随换行符,应使用
buff[strlen(buff)-1]='\0'
。顺便说一下,查看
fgets
是否成功的正确方法是检查它是否返回
NULL
。因此,通常会使用像
while(fgets(…)!=NULL)
这样的循环。在文档中,是什么让您相信它将可预测地返回
1
,特别是在测试
if(strcmp(buff,curr->stringDat)==1)
?@WhozCraig,很好,我将我的代码更改为>0…谢谢你指出这一点。@Someprogrammerdude确实提供了帮助,我现在唯一的问题是输入一个空白字符串并没有停止循环…请参阅上面更新的代码