首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从fgets()输入中删除尾随换行符

从fgets()输入中删除尾随换行符
EN

Stack Overflow用户
提问于 2010-04-23 03:21:19
回答 11查看 430.6K关注 0票数 295

我正在尝试从用户那里获取一些数据,并将其发送到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并发送正确字符串。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-04-23 03:26:53

优雅的方式:

Name[strcspn(Name, "\n")] = 0;

略显丑陋的方式:

char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';
else
    /* input too long for buffer, flag error */

稍微有点奇怪的方式:

strtok(Name, "\n");

请注意,如果用户输入空字符串(即只按Enter键),则strtok函数不会按预期工作。它保持\n字符不变。

当然,还有其他的。

票数 209
EN

Stack Overflow用户

发布于 2015-02-12 02:54:57

也许最简单的解决方案使用了我最喜欢的一个鲜为人知的函数,即strcspn()

buffer[strcspn(buffer, "\n")] = 0;

如果你想让它也处理'\r' (比方说,如果流是二进制的):

buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...

该函数计算在遇到'\r''\n'之前的字符数(换句话说,它会找到第一个'\r''\n')。如果没有命中任何东西,它会在'\0'处停止(返回字符串的长度)。

请注意,即使没有换行符,这种方法也能正常工作,因为strcspn会在'\0'处停止。在这种情况下,整行代码只是将'\0'替换为'\0'

票数 525
EN

Stack Overflow用户

发布于 2010-04-23 03:26:56

size_t ln = strlen(name) - 1;
if (*name && name[ln] == '\n') 
    name[ln] = '\0';
票数 83
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2693776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档