【发布时间】: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->stringDat) == 1)的测试中?跨度> -
@WhozCraig,好点,我将代码更改为 > 0...谢谢您指出这一点。
-
@Someprogrammerdude 确实有帮助,我现在唯一的问题是输入一个空白字符串并没有停止循环......请参阅上面的更新代码
标签: c linked-list stdin fgets