0

配列について学びました。配列を使ってデータベースプログラムを作ろうとしていました。これは非常に基本的なプログラムです。

#include<stdio.h>
#define N 1 //number of entries needed
int main()
{
    int i, k = 1, l = 1, w, x = 0, y = 0;
    int rollnum[N], hsc[N], cet[N], a[N], b[N];
    char name[100], city[100], c;
    for(i = 0; i < N; i++)
    {
        printf("%d.\n", (i+1));
        printf("Enter first name : ");
        do
        {
            c = getchar();
            if(c != '\n')
            {
            name[k] = c;
            k++;
            }
        }
        while(c != '\n');
        a[i] = k;
        k++;
        printf("\n");
        printf("Enter roll number : ");
        scanf("%d", &rollnum[i]);
        printf("\n");
        getchar();
        printf("Enter city : ");
        do
        {
            c = getchar();
            if(c != '\n')
            {
            city[l] = c;
            l++;
            }
        }
        while(c != '\n');
        b[i] = l;
        l++;
        printf("\n");
        printf("Enter HSC percentage : ");
        scanf("%d", &hsc[i]);
        printf("\n");
        printf("Enter CET marks : ");
        scanf("%d", &cet[i]);
        printf("\n");
        getchar();
    }

printf("\n\n\n");
k = 1;
l = 1;
for(i = 0; i < N; i++)
{
    printf("Entry %d\n", (i+1));
    printf("Student Name : ");
    x = (a[i] - x);
    for(w = 0; w < x; w++ && k++)
        putchar(name[k]);
    putchar('\n');
    printf("Roll number : %d", rollnum[i]);
    printf("\n");
    printf("City : ");
    y = (b[i] - y);
    for(w = 0; w < y; w++ && l++)
        putchar(city[l]);
    putchar('\n');
    printf("Marks : \n");
    printf("\t");
    printf("HSC : %d ", hsc[i]);
    printf("\t");
    printf("CET : %d / 200", cet[i]);
    printf("\n\n\n");
}
return 0;
}

プログラムが思ったとおりに機能していません!名前を入力すると、最初の文字が2回印刷されます。これは、都市の場合と同じです。'N'を変更して2つのエントリを入力すると、名前とアドレス(2番目のエントリの)の最初の文字がガベージ値として取得されます。ノートブックで手動で実行しようとしましたが、エラーが見つからなかったため、ロジックにエラーはないと思います。

誰かが私が間違いを見つけるのを手伝ってくれる?このプログラムはまったく効率的ではないかもしれませんが、私は学んだことを試しているだけです。

4

1 に答える 1

2

いくつかの変数を初期化する際にいくつかの間違いを犯しました。また、一度に1文字ずつ文字列を読み取る必要はありません。scanf("%s", someString)文字列全体を読み取るために使用できます。

そして、これがはるかにきれいに見える動作するコードです:

#include<stdio.h>
#define N 2 
int main()
{
    int rollnum[N], hsc[N], cet[N], i;
    char name[100][100], city[100][100];
    for(i = 0; i < N; i++)
    {
        printf("%d.\nEnter first name : ", (i+1));
        scanf("%s", name[i]);
        printf("\nEnter roll number : ");
        scanf("%d", &rollnum[i]);
        printf("\nEnter city : ");
        scanf("%s", city[i]);
        printf("\nEnter HSC percentage : ");
        scanf("%d", &hsc[i]);
        printf("\nEnter CET marks : ");
        scanf("%d", &cet[i]);
        printf("\n");
    }

printf("\n\n\n");

for(i = 0; i < N; i++)
{
    printf("Entry %d\nStudent Name : %s\nRoll number : %d\nCity : %s\nMarks : \n\tHSC : %d \tCET : %d / 200\n\n\n", (i+1), name[i], rollnum[i], city[i], hsc[i], cet[i]);
}

return 0;
}

複数のエントリに対しても機能します。

プログラムを機能させるには、これを置き換える必要があります。

x = (a[i] - x);
    for(w = 0; w < x; w++ && k++)
        putchar(name[k]);
    putchar('\n');
    printf("Roll number : %d", rollnum[i]);
    printf("\n");
    printf("City : ");
    y = (b[i] - y);
    for(w = 0; w < y; w++ && l++)
        putchar(city[l]);

これとともに:

if (i == 0)
  x = a[i]-1;
else
  x = a[i] - a[i-1];
for(w = 0; w < x; w++)
    putchar(name[k++]);
putchar('\n');
printf("Roll number : %d", rollnum[i]);
printf("\n");
printf("City : ");
if (i == 0)
  y = b[i]-1;
else
  y = b[i] - b[i-1];
for(w = 0; w < y; w++)
    putchar(city[l++]);

問題は、単語の長さを正しく計算しなかったことと、まだ説明できない別のエラーでしたが、それを削除しました。

于 2012-09-29T04:06:08.150 に答える