C FGET的意外结果

C FGET的意外结果,c,fgets,C,Fgets,结果并不像我预期的那样。。。我的意思是名字和姓氏在一行(例如马克·扎克伯格)。但结果是这样的 标记 扎克伯格 这里怎么了?为什么中间有新的一行?请参见手册页 引述: fgets()从流中最多读入一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。终止空字节(aq\0aq)存储在缓冲区中最后一个字符之后 因此,读取的字符串在末尾包含新行字符。您将需要删除它 编辑 要删除行尾(并允许DOS),请执行以下操作 根据Ed的建议,请参阅手册

结果并不像我预期的那样。。。我的意思是名字和姓氏在一行(例如马克·扎克伯格)。但结果是这样的

标记

扎克伯格

这里怎么了?为什么中间有新的一行?

请参见手册页

引述:

fgets()从流中最多读入一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。终止空字节(aq\0aq)存储在缓冲区中最后一个字符之后

因此,读取的字符串在末尾包含新行字符。您将需要删除它

编辑

要删除行尾(并允许DOS),请执行以下操作


根据Ed的建议,请参阅手册,用
'
(简单空格)替换
'\n'
的简单方法可以是:

int end = strlen(first_name) - 1;
if (end >= 0 && '\n' == first_name[end])
{
   first_name[end--] = 0;
   if (end >= 0 && '\r' == first_name[end]) first_name[end] = 0;
}
strlen
使用
string.h
,别忘了将其包括在内

fgets()
,当您在键入Mark后按enter键时,将“\n”存储在变量first\u name中,因此first\u name中存储的字符串是“Mark\n”,
printf()
将只执行其任务并打印换行符

另一个好的选择是使用
fscanf()

编辑:

检查
fscanf()
错误

fscanf (stdin, "%s", first_name);

fgets
不会跳过“\n”,这是您的工作感谢您的回复!但是,如何删除结尾的换行符呢?有谁能想出比以下更好的方法来删除它:
first\u name[strcspn(first\u name,“\n”)]='\0'?@modifiablelvalue-我在回复中没有使用该函数?很好:)我现在将删除不必要的更正。@ProgrammingNerd-是的,它们是相同的。只是偏好的问题。如果最后一个字符不是
“\n”
,这会有一个不幸的副作用,即删除一个重要字符。@我知道可修改的左值,我只想给您一个提示,谢谢。这确实有效:)但为什么当我输入我的名字时,“\n”在字符串的末尾?(来自Ed引用的手册页)从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。缓冲区中最后一个字符后存储了一个终止空字节(aq\0aq)。我喜欢这样。不幸的是,您没有深入研究fscanf的返回值。如果您能向OP展示如何确保fscanf成功,您将赢得我的+投票。@modifiablelvalue,很好的建议,非常有用。。。。
first_name[strlen(first_name) - 1] = ' ';
fscanf (stdin, "%s", first_name);
char str[50];
int bytes = -1;
fscanf (stdin, "%s%n",str,&bytes);
 if(bytes == -1)
    perror("\nIncomplete Bytes Parsed\n");