以也许最明显的方式删除换行符的步骤:
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);
}
请注意,如果输入字符串中嵌入\0
s,则此方法不起作用。如果是这样的话strlen()
,只会返回直到第一个字符为止的字符数\0
。但是,这并不是一种很常见的方法,因为大多数读取字符串的函数通常在第一个处停止,\0
然后将字符串提取到该空字符为止。
除了问题本身。尝试避免使代码不清楚的双重否定:if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
。你可以简单地做if (fgets(Name, sizeof Name, stdin) == NULL) {}
。
if (!fgets(Name, sizeof Name, stdin))
(至少不要使用两个否定符!和!=)