使fgets()忽略换行符

4
以下代码应该从用户那里获取含有存储物品数据的字符串。
我遇到了麻烦,无法让程序迭代到新的一行。当我按下“回车”时它会终止,但实际上我需要它将下一行作为输入。 代码如下:
for (i; i < STORE_SIZE; i++) {
    fgets(seq, MAX_STRING_LEN, stdin);
    if (strcmp(seq, "stop")) {
        break;
    }
    else {
        init(seq, ptr);
        *(storage + i) = ptr;
    }
}

程序应在下一行获取字符串“stop”时中止,而不是通过按Enter键。

我不应该被设置为0吗? - kylemart
3
请查看strcmp在匹配时返回的内容。它并不像你代码中所想的那样。另外,请查看从fgets()输入中删除尾随换行符 - kaylum
1
  1. 如果缓冲区以换行符结尾,则将其删除。
  2. 如果缓冲区现在为空,请再次调用 fgets
- David Schwartz
在调用 fgets() 函数时,始终检查返回值以确保操作成功。一种方法是:for (i; i < STORE_SIZE && fgets(seq, MAX_STRING_LEN, stdin); i++) { - user3629249
然而,这行代码似乎有问题:init(seq, ptr); 并且不能通过该行代码更新 ptr 的内容。也许你的意思是:init(seq, &ptr); - user3629249
显示剩余2条评论
1个回答

6

fgets函数在遇到换行符时,会将它添加到缓冲区中。唯一的去除方法是手动删除它,例如:

size_t len = strlen(seq);
if (len > 0 && seq[len - 1] == '\n')
    seq[len - 1] = '\0';

或者更加简洁但可能更加令人困惑的是:
seq[strcspn(seq, "\n")] = '\0';
strcspn()函数在第一个参数内查找第二个参数中任意字符的第一次出现,并返回该字符的索引,如果没有找到任何字符,则返回字符串结尾的索引。
另外,请注意strcmp()返回0,如果两个字符串相等。该函数用于按字典顺序比较字符串。
此外,for循环的第一部分是无意义的,你确定你不是想要这样做:
for (i = 0; ...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接