以最明显的方式删除换行符的步骤:
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
则此后的字符串将是一个空字符串。
if
我们可以使用逻辑运算符将步骤 2. 和 3. 组合在一个语句中&&
:
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) {}
。