#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票将禁止我提出进一步的问题。 您可以发表评论,如果这个问题真的多余或天真或琐碎但不投票,我会留意删除这个问题。 谢谢。
答案 0 :(得分:2)
使用fgets()
读取所有内容,或使用cin >> ...
读取所有内容。不要混合它们。虽然可以将它们混合在一起,但是有很多问题 - 比如你所看到的 - 这样做。
例如,......
fgets()
来阅读某些内容,请使用fgets()
来阅读所有内容,并且不要在同一个流上使用C ++流提取(运算符>>
等)。原因是它们以不同的方式处理换行符之类的事情 - 例如,流提取可能会使换行符挂起,随后的fgets()
调用将立即遇到它,并立即返回(并且不会读取数据,因为您正在看。)stdin
和C ++ std::cin
,最好使用一个或者一个
其他而不是混合它们,因为它们各自缓冲数据的方式不同 - 并且,取决于系统如何管理流,或者其他功能如何
您的程序设置stdin
或std::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;