使 fgets() 忽略新行

bok*_*666 4 c

以下代码应从用户获取字符串(包含存储中的项目数据)。

我在使程序迭代到新行时遇到问题。当我按下“输入”时它会中止,但我需要它只将下一行作为输入。代码:

for (i; i < STORE_SIZE; i++) {
    fgets(seq, MAX_STRING_LEN, stdin);
    if (strcmp(seq, "stop")) {
        break;
    }
    else {
        init(seq, ptr);
        *(storage + i) = ptr;
    }
}
Run Code Online (Sandbox Code Playgroud)

当程序在下一行中得到字符串“stop”时,程序应该中止,而不是按下回车键。

dre*_*lax 6

fgets遇到换行符时,将始终将换行符添加到缓冲区。摆脱它的唯一方法是手动删除它,例如:

size_t len = strlen(seq);
if (len > 0 && seq[len - 1] == '\n')
    seq[len - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

或者,更简洁但可能更令人困惑:

seq[strcspn(seq, "\n")] = '\0';
Run Code Online (Sandbox Code Playgroud)

strcspn()函数在第一个参数内查找第二个参数中任何字符的第一次出现,并返回该字符的索引,如果没有找到任何字符,则返回字符串末尾的索引。

另外,请记住,strcmp()如果字符串相等,则返回 0。该函数用于在词法上比较字符串。

此外,您的 for 循环的第一部分毫无意义,您确定您的意思不是:

for (i = 0; ...)
Run Code Online (Sandbox Code Playgroud)