【问题标题】:C user input and Linked ListC 用户输入和链表
【发布时间】:2016-11-15 07:15:23
【问题描述】:

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

我能够接收字符串并找到要插入的位置,但我想做的是循环直到用户输入空白输入。这导致我的代码在某处中断,我不太清楚为什么。我在我的代码中插入了断点来调试它,但我相信我遇到了 fgets 的问题。任何帮助都会很棒。

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

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");
    }
}

**** 更新的代码(仍然不会在空白输入时停止)****

else{
        while (fgets(buff, BUFF_SIZE, stdin) != NULL){
            buff[strlen(buff) - 1] = '\0';
            insertPnt = 1;

            printf("BREAK1: %s\n", buff);
            // set curr = root node
            curr = root;
            printf("BREAK2\n");
            while (curr->next){
                if (strcmp(buff, curr->stringDat) > 0){
                    insertPnt++;
                    curr = curr->next;
                }
                else{
                    insert(buff, insertPnt, root);
                    printf("%-20s   %d\n", buff, insertPnt);
                    // PRINT LINKED LIST
                    print(root);
                    break;
                }
            }

            // clear buffer
            for (i = 0; i < BUFF_SIZE; i++) {
                buff[i] = 0;
            }
            printf("BREAK5\n");

        }
    }

【问题讨论】:

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

标签: c linked-list stdin fgets


【解决方案1】:

字符串和位置正确,但打印在 多行

因为您没有剥离 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';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多