2015-09-06 51 views
-2
#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; 
} 

这段代码工作正常只有第一次,但之后的第一个,在第二次迭代我不能写的人名(跳过直接到person [n] .name)。我不能不知道可能是什么问题,尽管我猜它可能与fgets函数的工作方式有关。如何读取多个使用字符串与fgets()

请不要投票,这可能看起来微不足道,但它是我面临的一个问题,太多的投票将使我无法提出进一步的问题。 你可以发表评论,如果这个问题真的是多余的,天真或微不足道的,但我不会投票,我会留意删除这个问题。 谢谢。

回答

0

您发布的代码缺少struct addr的声明,但我想这只是一种类型(它不会编译)。

此行为可能是由fgets和流输入读取器cin的混合使用引起的。您的程序中只能使用其中的一种,因为它们的行为完全不同。试着用

fgets(person[n].ph_num, 30, stdin); 
+0

我正在回答这个问题,尽管谦逊的请求家伙已经投了票。 –

2

要么更换cin >> person[n].ph_num;使用fgets()阅读一切,或使用cin >> ...吨读到的一切。不要混合它们。虽然可以将它们混合使用,但有许多问题 - 例如您所看到的 - 这样做。

例如,...

  • 贵公司的所有输入以一致的方式。如果使用fgets()来读取某些内容,请使用fgets()来读取所有内容,并且不要在同一个流中使用C++流提取(运算符>>等)。原因是他们以不同方式处理诸如换行符之类的事情 - 例如,流提取可能会留下换行符,并且随后的调用fgets()将立即遇到它,并立即返回(并且不会读取数据,如您所见)。
  • 虽然是C的 stdin之间的关系,并同步C++ std::cin,这是一个好主意,用一个或另一个 ,而不是混合使用它们,因为它们每一个缓冲区中的数据不同 - 而且,根据系统如何管理数据流,还是其他函数stdinstd::cin或其 缓冲区的程序集属性如何,它们之间可能会有类似的意外交互。
+0

在使用c风格的i/p后,问题仍然存在。我仍然无法在第二次迭代中写人名。 –

+0

因此,改变你的代码,并避免在使用'fgets(....,stdin)'后立即使用'cin >> ...'。例如,使用'fgets()'执行'stdin'的所有读取,并根据需要解释数据(作为名称,街道,数字)。另外请记住,从'stdin'读取不一定需要'std :: cout'。 – Peter

+0

我必须使用fflush(stdin);刷新标准输入流以按预期执行程序。 –