以也许最明显的方式删除换行符的步骤:
NAME使用strlen()header 来确定内部字符串的长度string.h。请注意,strlen()这不算终止\0。
size_t sl = strlen(NAME);
- 查看字符串是否以一个
\0字符开头或仅包含一个字符(空字符串)。在这种情况下sl,是0因为strlen()如上所述,我不计算\0并在第一次出现时停止:
if(sl == 0)
{
// Skip the newline replacement process.
}
- 检查正确字符串的最后一个字符是否为换行符
'\n'。如果是这样的情况下,更换\n了\0。请注意,索引计数从开始,0因此我们需要这样做NAME[sl - 1]:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
请注意,如果仅在fgets()字符串请求时按Enter (字符串内容仅由换行符组成),NAME此后的字符串将为空字符串。
- 我们可以在短短的一个结合步骤2和3一起
if通过逻辑运算语句来&&:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- 完成的代码:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
如果您希望通过处理fgets输出字符串而不用每次都重新键入而喜欢使用此技术的函数,则这里是fgets_newline_kill:
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
在您提供的示例中,它将是:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
请注意,如果输入字符串中嵌入\0s,则此方法不起作用。如果是这样的话strlen(),只会返回直到第一个字符为止的字符数\0。但是,这并不是一种很常见的方法,因为大多数读取字符串的函数通常在第一个处停止,\0然后将字符串提取到该空字符为止。
除了问题本身。尝试避免使代码不清楚的双重否定:if (!(fgets(Name, sizeof Name, stdin) != NULL) {}。你可以简单地做if (fgets(Name, sizeof Name, stdin) == NULL) {}。
if (!fgets(Name, sizeof Name, stdin))(至少不要使用两个否定符!和!=)