1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 2
int main() {
    typedef struct {
        char firstName[30];
        char lastName[30];
        char street[35];
        char city[20];
        char state[3];
        int  zip;
        char phone[15];

        int  accountId;
    } Customer ;
    Customer customerArray[RECORDS];    


    typedef int records;
    records i = 0;  

    printf("================================================================\n");
    for(i = 0; i < RECORDS; ++i)
    {   

        printf("Enter data for customer %d\n", i + 1);
        printf("Enter firstname, last name, phone\n");
        scanf("%s %s %s", customerArray[i].firstName, customerArray[i].lastName, customerArray[i].phone);
        scanf("%*c");   

        printf("Enter Address (Street City State ZIP\n");
        scanf("%s %s %s %d", customerArray[i].street, customerArray[i].city, customerArray[i].state, &customerArray[i].zip);
        scanf("%*c");   

    }   


    for(i = 0; i < RECORDS; ++i) {
        char input[3]= {'\0'};
        printf("please enter state:\n");
        scanf("%s",input);  

        int strcmp(const char *s1, const char *s2);
        int strncmp(const char *s1, const char *s2, size_t n);
        char *custstate = customerArray[i].state;
        char *statelookup = input;


        if (strcmp(custstate, statelookup) == 0) {
        printf("\nData for customer number:%s", customerArray[i].accountId);
        printf("\nAccount:%s", customerArray[i].accountId);
        printf("\n Name:%s %s",customerArray[i].firstName, customerArray[i].lastName);
        printf("\nAddress:%s %s %s %d",customerArray[i].street, customerArray[i].city, customerArray[i].state, customerArray[i].zip);
        printf("\nPhone:%s",customerArray[i].phone);    

        }
        else
            printf("Could not find a match");

    }
    return 0;   


}

この構造体のメンバーの 1 つが正しくインクリメントされない理由を理解するのに苦労しています。アカウント ID は不正確な出力を生成します。また、顧客番号が正しく生成されていません。例: 1、2 など。

上記のメンバーの出力は次のようになります...

顧客番号のデータ:1606416396 アカウント:1606416396

どこに見えるべきか

顧客 1 のデータ アカウント 1

何が間違っているのかわかりません。まだ C を学んでいます。どんな助けでも大歓迎です!

メンバーをヌル終了する必要があると考えています。しかし、それが本当かどうか、またはその方法についてはわかりません。

4

2 に答える 2

3

フィールドを初期化することはありませんaccountId。C では、初期化されていないフィールドを使用するとエラーが発生する代わりに、ランダムな値が使用されるだけです (RAM には最後にあったメモリからのランダムな値があるため)。したがって、巨大な無意味な値は、他のプログラムからの残り物であると説明されています。これを修正するには、アクセスする前に何かに設定する必要があります。

于 2013-02-25T05:01:55.553 に答える
0

プログラムで使用するすべての変数は、主に 2 つの領域に存在します。

  1. スタック セグメント
  2. データセグメント

デフォルトでは、すべての自動プログラム変数と構造変数はスタックに格納されるため、すべてのスタック変数と同様に、コンパイラによって初期化されず、通常ジャンク値として知られる予測不可能な値が含まれます。宣言中に変数を明示的に初期化することを常にお勧めします。

主にデータ セグメントに存在する変数は、ほとんどがグローバル変数と静的変数です。これらの変数は宣言中に自動的に 0 に初期化されるため、不要な値は見つかりません。

static int i =0;  

と同じです

static int i;

詳細については、このページをご覧ください。

http://www.geeksforgeeks.org/memory-layout-of-c-program/

于 2013-02-25T08:24:06.660 に答える