2016-11-15 74 views
0

我想从用户输入中吸收一个字符串,然后将其与我以前在代码中创建的链接列表进行比较,并找到该字符串应插入的位置。当用户什么都不输入并且输入时停止循环。C用户输入和链接列表

我能够吸收字符串并找到要插入的位置,但我想要做的是循环直到用户输入一个空白输入。这导致我的代码在某个地方崩溃,我不太清楚为什么。我在代码中插入了断点来调试它,但我相信我遇到了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"); 

     } 
    } 
+1

可能与你的问题......在'fgets'调用'的buff [strlen的(BUFF)后'已经等于一个字符串结束。如果你想删除***可能的***尾随换行符,你应该使用'buff [strlen(buff) - 1] ='\ 0''。 –

+0

顺便说一句,查看'fgets'是否成功的正确方法是检查它是否返回NULL。因此通常使用像'while(fgets(...)!= NULL)'的循环。 –

+1

在['strcmp()'](http://en.cppreference.com/w/c/string/byte/strcmp)的文档中,你会相信这个函数会*预测*返回1 ',特别是在if(strcmp(buff,curr-> stringDat)== 1)''的测试中? – WhozCraig

回答

2

的字符串和位置是正确的,但它

:上 多行

因为你不剥离后新线由fgets lefted正在打印

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'; 
}