如何使用fgets()读取多个字符串

时间:2015-09-06 14:01:06

标签: fgets

#include <iostream>
#include<cstdio>
#include<string>
#include<cstdlib>

using namespace std;
struct addr           
 char name[30];    
char street[30];  
long int ph_num;   
};
int main()
{

 addr person[2];
 int a;
 for(int n=0;n<2;n++)
 {
  puts("Enter name of person");
  fgets(person[n].name,30,stdin);
  a=(strlen(person[n].name)-1);
   if(person[n].name[a]=='\n')
 {
     person[n].name[a]='\0';
 }
  puts(person[n].name);
  puts("Enter street of person");
  fgets(person[n].street,30,stdin);
 a=(strlen(person[n].street)-1);
 if(person[n].street[a]=='\n')
 {
     person[n].street[a]='\0';
 }
  puts(person[n].street);
  puts("Enter ph of person");
  scanf("%ld",&person[n].ph_num);
  printf("%ld",person[n].ph_num);

 }

return 0;
}

这段代码只是第一次正常工作但在第一次之后,在第二次迭代中我无法写出人名(直接跳到人[n] .name)。我不能虽然我猜这可能与fgets功能的工作方式有关,但不要在这里得到可能存在的问题。

请不要投票,这可能看起来微不足道但是我面临的问题和太多的-ve票将禁止我提出进一步的问题。 您可以发表评论,如果这个问题真的多余或天真或琐碎但不投票,我会留意删除这个问题。 谢谢。

2 个答案:

答案 0 :(得分:2)

使用fgets()读取所有内容,或使用cin >> ...读取所有内容。不要混合它们。虽然可以将它们混合在一起,但是有很多问题 - 比如你所看到的 - 这样做。

例如,......

  • 以一致的方式完成所有输入。如果使用fgets()来阅读某些内容,请使用fgets()来阅读所有内容,并且不要在同一个流上使用C ++流提取(运算符>>等)。原因是它们以不同的方式处理换行符之类的事情 - 例如,流提取可能会使换行符挂起,随后的fgets()调用将立即遇到它,并立即返回(并且不会读取数据,因为您正在看。)
  • 虽然C&C之间存在关系和同步 stdin和C ++ std::cin,最好使用一个或者一个 其他而不是混合它们,因为它们各自缓冲数据的方式不同 - 并且,取决于系统如何管理流,或者其他功能如何 您的程序设置stdinstd::cin或其属性的属性 缓冲区,它们之间可能存在类似的意外交互。

答案 1 :(得分:0)

您发布的代码缺少Error:(1) No resource found that matches the given name (at 'background' with value '@drawable/splash_image').的声明,但我想这只是一种类型(它不会编译)。

此行为可能是由struct addr和流输入阅读器fgets的混合使用引起的。您应该只在程序中使用其中一个,因为它们的行为完全不同。尝试将cin替换为

cin >> person[n].ph_num;