【问题标题】:Unexpected result with fgets [duplicate]fgets的意外结果[重复]
【发布时间】:2013-02-19 15:53:07
【问题描述】:
int main(int argc, char** argv)
{
//Local Declaration
char last_name[20];
char first_name[20];
char phone_number[20];
char address[30];

//Statement
printf("Enter your last name: ");
fgets(last_name, 20, stdin);

printf("Enter your first name: ");
fgets(first_name, 20, stdin);

printf("Enter your phone number: ");
fgets(phone_number, 20, stdin);

printf("Enter your address: ");
fgets(address, 30, stdin);

printf("=====Address book=====\n");
printf("Name: %s%s\n", first_name, last_name);
printf("Phone Number: %s\n", phone_number);
printf("Address: %s\n", address);
return (EXIT_SUCCESS);
}

结果并没有像我预期的那样出现......我的意思是名字和姓氏在一行中(例如 Mark Zuckerberg)。但是结果是这样的

标记

扎克伯格

这里有什么问题?为什么中间有一条新线?

【问题讨论】:

  • fgets 不会跳过'\n',那是你的工作

标签: c fgets


【解决方案1】:

查看手册页

引用:

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

所以fgets 读取的字符串末尾包含换行符。您需要将其删除。

编辑

要删除行尾(并允许 DOS)做

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;
}

【讨论】:

  • 感谢您的回复!但是最后如何删除换行符?
  • 谁能想出比first_name[strcspn(first_name, "\n")] = '\0';更好的方法来删除它?
  • @modifiablelvalue - 我的回复中没有使用该功能?
  • 一切都好 :) 我现在将删除不必要的更正。
  • @ProgrammingNerd - 是的,它们是一样的。只是偏好问题。
【解决方案2】:

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

first_name[strlen(first_name) - 1] = ' ';

strlen 使用 string.h,不要忘记包含它

【讨论】:

  • 如果最后一个字符不是'\n',这会带来删除重要字符的不幸副作用。
  • @modifiablelvalue 我知道,我只是想给 OP 一个提示
  • 谢谢。这绝对有效:)
  • 但是为什么在我输入我的名字时字符串的末尾会出现'\n'?
  • (来自 Ed 引用的手册页)从流中最多读取一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。
【解决方案3】:

fgets() ,将 '\n' 存储在变量 first_name 中,当您按 Enter 时,键入 Mark 后,存储在 first_name 中的字符串为 "Mark\n" ,printf() 将完成其工作并打印换行符。

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

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

编辑:

检查fscanf() 错误。

char str[50];
int bytes = -1;
fscanf (stdin, "%s%n",str,&bytes);
 if(bytes == -1)
    perror("\nIncomplete Bytes Parsed\n");

【讨论】:

  • 我喜欢这个。不过,很遗憾您没有深入研究 fscanf 的返回值。如果您可以向 OP 展示如何确保 fscanf 成功,您将获得我的 + 投票。
  • @modifiablelvalue ,不错的建议,真的很有帮助....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2017-10-04
  • 2014-12-01
  • 2013-04-03
  • 2014-10-09
相关资源
最近更新 更多