0

以下のコードを実行して最大識字率と最大収入を見つけると、プログラムは適切に入力を受け取りますが、最後に最後の 2 つの printf ステートメントの出力を表示すると、「segmentation fault.core dumped」というエラーが表示されます。何が間違っているのか説明してください..よろしくお願いします。

#include<stdio.h>
#include<stdlib.h>

#define MAX 50
struct state_det {
char name[50];
long population;
float literacy;
long income;
}s[MAX];

int main()
{
int n,i,max_lit = 0, max_income = 0;
int t, p;
printf("enter number of states\n");
scanf("%d",&n);

for(i = 0; i < n; i++)
{
printf("enter the name of the state %d\n",i);
scanf("%s",&s[i].name);
printf("enter the population of the state %d\n",i);
scanf("%ld",&s[i].population);
printf("enter the literacy rate of the state %d\n",i);
scanf("%f",&s[i].literacy);
printf("enter the average income of the state %d\n",i);
scanf("%ld",&s[i].income);
}

max_lit = s[0].literacy;
max_income = s[0].income;

for(i = 1; i < n; i++)
{
if(max_lit < s[i].literacy)  {
max_lit = s[i].literacy;
t = i;
}

if(max_income < s[i].income) {
max_income = s[i].income;
p = i;
}
}

printf("\nthe state with highest literacy is %s and rate = %f\n",s[t].name, s[t].literacy);

printf("\nthe state with highest income is %s and rate = %ld\n",s[p].name, s[p].income);


return 0;
}
4

3 に答える 3

0

この線

scanf("%s",&st[i].name);

する必要があります

scanf("%s",s[i].name);

指定子%sが探していてchar*、渡そうとしているためですchar (*)[50]

于 2013-10-28T05:38:33.577 に答える
0

scanf文字列には使用しないでくださいfgets(s[i].name,50,stdin)

以来scanf cannot read spaces in a stringhello worldサイズが 50 未満で入力したとします。これは、文字列が検出されるとすぐに文字列の読み取りが終了するため、hello考慮され、文字列には保存されません。worldspace characterscanf

また、ゼロ番目の要素自体が最大の識字率と収入である場合は、t と p の値を 0 に初期化する必要があります。の値t and p are garbage values

&それらを読んで、scanf での文字列の読み取りに使用しない理由を理解してください

C: scanf() 関数の文字列に & がないのはなぜですか?

scanf() は、以前に定義された文字列の配列の最初の文字列が null の場合、入力文字列を読み取らない

char 配列の scanf で「&」を使用しない理由

scanf で文字列を読み取る

于 2013-10-28T05:40:05.587 に答える
0

t と p は初期化されません。データの 0 番目の要素が最大の収入またはリテラシーを持っている場合、t または p は定義されず、範囲外の配列要素にアクセスします。これは、後続の状態よりも低い値で 0 番目の状態データを入力することによって確認できます。

解決策は、t と p を 0 に初期化することです。

PS : コードをインデントしてください。読みにくいです。PPS : max_lit は float である必要があります。PPPS : エラー チェックを行う必要があります (たとえば、n <= 50 の場合など)。

于 2013-10-28T05:40:28.570 に答える