我试图让这个结构打印出来,我无法弄清楚出了什么问题。 该代码应该执行以下操作: - 从键盘中读取名字,姓氏,ss#和年龄,并将它们保存在变量:person中。
- 从变量:person显示姓氏,名字,年龄和ss#。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Rec
{
char firstName [20];
char lastName [30];
char ss [12];
int age;
};
int main()
{
struct Rec person;
char personInfo[100];
int i;
printf("Enter a first name, a space, a last name, a space, a ss#, a space, and an age all on the same line.");
scanf("%s" , &personInfo);
for (i=0, i<100; i++)
{
int count=0, z=0;
if (personInfo[i]= ' ')
count++;
else if( count ==0)
{
for (z=0; z<100; z++)
person[z].firstName=personInfo[i];
}
else if (count ==1)
{
for (z=0; z<100; z++)
person[z].lastName=personInfo[i];
}
else if (count ==2)
{
for (z=0; z<100; z++)
person[z].ss=personInfo[i];
}
else if (count ==3)
{
for (z=0; z<100; z++)
person[z].age=personInfo[i];
}
}
printf("Name: %s %s, Social Security: %s, Age: %d\n", person[i].firstName, person[i].lastName, personInfo[i].ss, personInfo[i].age);
system("Pause");
}
答案 0 :(得分:1)
我看到的问题:
<强>一强>
scanf("%s" , &personInfo);
scanf
会在找到空格时停止阅读。它只会读取名字。
您需要使用fgets
来检索一行文本,包括空格。
<强>两个强>
person[z].firstName=personInfo[i];
person[z].firstName
的类型为char [20]
。 personInfo[i]
的类型为char
。这是一项无效的作业。你的意图对我来说并不清楚。
<强>三强>
printf("Name: %s %s, Social Security: %s, Age: %d\n", person[i].firstName, person[i].lastName, personInfo[i].ss, personInfo[i].age);
在执行此行时,i
的值为100
。您正在访问person[100]
,这超出了分配的有效内存。这将导致不确定的行为。
<强>建议强>
如果您想要阅读100
个记录并逐个打印,则需要两个for
块,而不是一个。第一个for
循环遍历人数。第二个for
循环遍历每行读取的字符。
for (i=0, i<100; i++)
{
// Read the record of the i-th person.
fgets(personInfo, 100, stdin);
for ( int j = 0; j < 100; ++j )
{
// Extract the info from the line and fill up the data
// in person[i]
}
// Print the record of the i-th person.
}