我试图从用户那里获取一些数据并将其发送到gcc中的另一个函数 . 代码是这样的 .
printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
但是,我发现它最后有一个换行符 \n
字符 . 因此,如果我输入 John
,它最终会发送 John\n
. 如何删除 \n
并发送正确的字符串 .
12 回答
有点丑陋的方式:
有点奇怪的方式:
请注意,如果用户输入空字符串(即仅按Enter键),
strtok
函数将无法按预期工作 . 它使\n
字符保持不变 .当然还有其他一些 .
也许最简单的解决方案使用我最喜欢的一个鲜为人知的函数,strcspn():
如果你想要它也处理
'\r'
(例如,如果流是二进制):该函数计算字符数,直到它达到
'\r'
或'\n'
(换句话说,它找到第一个'\r'
或'\n'
) . 如果它没有击中任何东西,它会在'\0'
处停止(返回字符串的长度) .请注意,即使没有换行,这也能正常工作,因为
strcspn
在'\0'
处停止 . 在这种情况下,整条线只是用'\0'
替换'\0'
.你应该试一试 . 此代码基本上循环遍历字符串,直到找到'\ n' . 当发现'\ n'将被空字符终止符'\ 0'替换时
请注意,您正在比较字符和不是这一行中的字符串,那么就不需要使用strcmp():
因为你将使用单引号而不是双引号 . Here's如果您想了解更多信息,请参阅有关单引号和双引号的链接
试试这个:
以下是从
fgets()
保存的字符串中删除潜在'\n'
的快速方法 .它使用
strlen()
,有2个测试 .现在根据需要使用
buffer
和len
.此方法的后续代码具有
len
值的附带好处 . 它可以比strchr(Name, '\n')
更快 . Ref YMMV,但两种方法都有效 .buffer
,原始fgets()
在某些情况下不会包含在"\n"
中:A)
buffer
的行太长,因此只有'\n'
之前的char
保存在buffer
中 . 未读的字符仍保留在流中 .B)文件中的最后一行没有以
'\n'
结尾 .如果输入在某处嵌入了空字符
'\0'
,则strlen()
报告的长度将不包括'\n'
位置 .其他一些答案的问题:
当
buffer
为"\n"
时strtok(buffer, "\n");
无法删除'\n'
. 从这个answer - 在这个答案之后修改了警告这个限制 .在
fgets()
读取的第一个char
为'\0'
的极少数情况下,以下情况失败 . 输入以嵌入的'\0'
开头时会发生这种情况 . 然后buffer[len -1]
变得buffer[SIZE_MAX]
肯定在buffer
的合法范围之外访问内存 . 黑客可能在愚蠢地阅读UTF16文本文件时尝试或找到的东西 . 当这个答案写完时,这就是answer的状态 . 后来非OP编辑了它,包括像这个答案检查""
的代码 .sprintf(buffer,"%s",buffer);
是未定义的行为:Ref . 此外,它不会保存任何前导,分隔或尾随空格 . 现在deleted .[稍后编辑answer]与
strlen()
方法相比,1衬里buffer[strcspn(buffer, "\n")] = 0;
除性能外没有问题 . 在代码正在进行I / O时,修整性能通常不是问题 - 这是CPU时间的黑洞 . 如果以下代码需要字符串的长度或具有高度的性能意识,请使用此strlen()
方法 . 否则strcspn()
是一个很好的选择 .如果每行都有'\ n',直接从fgets输出中删除'\ n'
除此以外:
单个'\ n'trmming,
多个'\ n'修剪,
TimČas的一个班轮对于通过调用fgets获得的字符串来说是惊人的,因为你知道它们最后包含一个换行符 .
如果您处于不同的上下文中并且想要处理可能包含多个换行符的字符串,那么您可能正在寻找strrspn . 它不是POSIX,意味着你不会在所有Unices上找到它 . 我为自己的需要写了一个 .
对于那些在C中寻找Perl chomp等效的人,我认为就是这样(chomp只删除尾随的换行符) .
strrcspn函数:
如果使用
getline
是一个选项 - 不要忽视它的安全问题,如果你想支持指针 - 你可以避免字符串函数,因为getline
返回字符数 . 像下面的东西注意:不应忽视getline的[安全问题] .
下面的函数是我在Github上维护的字符串处理库的一部分 . 它会删除字符串中不需要的字符,这正是您想要的
一个示例用法可能是
您可能想要检查其他可用功能,甚至可以参与项目:) https://github.com/fnoyanisi/zString