मैं एक साधारण पार्किंग व्यवस्था कोड लिखने की कोशिश कर रहा हूं, मैं क्षमता को 1000 वाहनों, रंग, लाइसेंस प्लेट और मॉडल द्वारा क्रमबद्ध करना चाहता हूं

#include <stdio.h>
#include <stdlib.h>
void NewCar()
{
    char model[1000][20];
    char color [1000][20];
    char number[1000][20];
    int x = 1;
        printf("\nModel: ");
        scanf("%s",model[x]);
        printf("Color: ");
        scanf("%s",color[x]);
        printf("Number: ");
        scanf("%s",number[x]);
}
void CarList()
{
    int x;
    char model[1000][20];
    char color [1000][20];
    char number[1000][20];
    for (x ; x >= 1 ; x--)
    {
        printf("\n%d. Car: %s %s %s",x,number[x],model[x],color[x]);
    }
}
int main()
{
    char model[1000][20];
    char color [1000][20];
    char number[1000][20];
    char menu;
    int x = 1;
    flag:
    printf("New Car(N)\nCar List(L)\n");
    scanf("%s",&menu);
    if (menu == "n" || menu == "N")
    {
        NewCar();
        goto flag;
    }
    if (menu == "l" || menu == "L")
    {
        CarList();
        goto flag;
    }
}

Code Output

जब मैं शून्य का उपयोग नहीं करता, तो कोड काम करता है लेकिन मुझे शून्य का उपयोग करना होगा

मुझे जो आउटपुट चाहिए उसका उदाहरण;

 1. Car Red Jeep FGX9425
 2. Car Yellow Truck OKT2637
 3. Car Green Sedan ADG4567
 ....
-1
AomineDaici 13 अप्रैल 2020, 01:32

1 उत्तर

सबसे बढ़िया उत्तर

यह मेरी शीर्ष टिप्पणियों द्वारा प्रस्तुत किया गया है।

कभी नहीं goto का उपयोग करें। while लूप का उपयोग करें (उदा.)

आपका scanf menu के लिए [शायद] अतिप्रवाह होगा।

जैसा कि अन्य ने उल्लेख किया है, कई बग।

मैंने आपके कोड को आपके पुराने कोड और कुछ नए कोड के साथ दोबारा प्रतिक्रिया दी है। इसे अभी भी अधिक त्रुटि जाँच की आवश्यकता है और इसे थोड़ा और सामान्यीकृत किया जा सकता है, लेकिन, मैंने इसे बुनियादी कार्यक्षमता के लिए परीक्षण किया है:

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

// description of a car
struct car {
    char model[20];
    char color[20];
    char number[20];
};

int
NewCar(struct car *cars,int carcount)
{
    struct car *car = &cars[carcount];

    printf("\nModel: ");
    scanf("%s", car->model);

    printf("\nColor: ");
    scanf("%s", car->color);

    printf("\nNumber: ");
    scanf("%s", car->number);

    ++carcount;

    return carcount;
}

void
CarList(struct car *cars,int carcount)
{
    struct car *car;
    int caridx;

    for (caridx = 0;  caridx < carcount;  ++caridx) {
        car = &cars[caridx];
        printf("%d. Car: %s %s %s\n",
            caridx + 1, car->number, car->model, car->color);
    }
}

int
main(int argc,char **argv)
{
#if 1
    int carcount = 0;
    struct car carlist[1000];
#endif
#if 0
    char menu;
    int x = 1;
#else
    char menu[20];
#endif

    // force out prompts
    setbuf(stdout,NULL);

    while (1) {
        printf("New Car(N)\nCar List(L)\n");
#if 0
        scanf("%s", &menu);
#else
        scanf(" %s", menu);
#endif

        // stop program
        if ((menu[0] == 'q') || (menu[0] == 'Q'))
            break;

        switch (menu[0]) {
        case 'n':
        case 'N':
            carcount = NewCar(carlist,carcount);
            break;

        case 'l':
        case 'L':
            CarList(carlist,carcount);
            break;
        }
    }

    return 0;
}

अद्यतन करें:

जैसा कि आपने कहा, कुछ छोटी-मोटी त्रुटियां हैं, यह मेरे लिए कोई समस्या नहीं है, लेकिन यदि आप उन्हें जानना और ठीक करना चाहते हैं तो मैं त्रुटियां लिख सकता हूं। (यदि आप इसके बीच की जगह के साथ प्लेट लिखते हैं, तो कोड "नया" दोहराता है कार कार सूची" कमांड कई बार)

ठीक है, मैंने एक उन्नत संस्करण तैयार किया है जो scanf को एक फ़ंक्शन askfor से बदल देता है जो fgets का उपयोग करता है। उत्तरार्द्ध [आकस्मिक] बफर अतिप्रवाह को रोकेगा। और, scanf और fgets को मिलाना समस्याग्रस्त हो सकता है। व्यक्तिगत रूप से, मैं हमेशा fgets का उपयोग करके "अपना खुद का रोल" करता हूं क्योंकि यह बेहतर अनाज नियंत्रण प्रदान कर सकता है [यदि रैपर कार्यों के साथ प्रयोग किया जाता है, जैसे askfor यहां प्रदान किया गया है]

संपादित करें: प्रति चक्स, मैंने नई लाइन को हटाने के लिए strlen को एक सुरक्षित संस्करण के साथ बदल दिया है जो strchr का उपयोग करता है:

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

#define STRMAX      20

// description of a car
struct car {
    char model[STRMAX];
    char color[STRMAX];
    char number[STRMAX];
};

// askfor -- ask user for something
void
askfor(const char *tag,char *ptr)
{

    printf("Enter %s: ",tag);
    fflush(stdout);

    fgets(ptr,STRMAX,stdin);

    // point to last char in buffer
    // remove newline
#if 0
    ptr += strlen(ptr);
    --ptr;
    if (*ptr == '\n')
        *ptr = 0;
#else
    // remove trailing newline [if it exists]
    ptr = strchr(ptr,'\n');
    if (ptr != NULL)
        *ptr = 0;
#endif
}

int
NewCar(struct car *cars,int carcount)
{
    struct car *car = &cars[carcount];

    askfor("Model",car->model);
    askfor("Color",car->color);
    askfor("Number",car->number);

    ++carcount;

    return carcount;
}

void
CarList(struct car *cars,int carcount)
{
    struct car *car;
    int caridx;

    for (caridx = 0;  caridx < carcount;  ++caridx) {
        car = &cars[caridx];
        printf("%d. Car: %s %s %s\n",
            caridx + 1, car->number, car->model, car->color);
    }
}

int
main(int argc,char **argv)
{
    int carcount = 0;
    struct car carlist[1000];
    char menu[STRMAX];

    // force out prompts
    setbuf(stdout,NULL);

    while (1) {
        askfor("\nNew Car(N)\nCar List(L)",menu);

        // stop program
        if ((menu[0] == 'q') || (menu[0] == 'Q'))
            break;

        switch (menu[0]) {
        case 'n':
        case 'N':
            carcount = NewCar(carlist,carcount);
            break;

        case 'l':
        case 'L':
            CarList(carlist,carcount);
            break;
        }
    }

    return 0;
}

अद्यतन #2:

आपके बग फिक्स के लिए धन्यवाद, लेकिन जैसा कि मैंने अपने प्रश्न में कहा था, मुझे शून्य का उपयोग करके "नई कार" सुविधा करनी है। आपने इसे int के साथ किया, क्या आप इसे void के साथ कर सकते हैं?

अच्छा जी। जब आपने कहा "शून्य का उपयोग करना", तो आपका मतलब मेरे लिए पूरी तरह से स्पष्ट नहीं था [या कुछ अन्य]। पर्याप्त बग थे कि उन्होंने कुछ अन्य विचारों की देखरेख की।

तो, मुझे यह मानना ​​​​होगा कि "शून्य का उपयोग करना" का अर्थ है कि कार्य void वापस आते हैं।

आपके मूल कार्यों को void NewCar() और void CarList() के रूप में परिभाषित किया गया था। वे जैसा है वैसा काम नहीं कर सकते थे, इसलिए उन्हें बदलना पड़ा।

यदि आपके पास समान मानदंड हैं, तो वाक्यांश का एक बेहतर तरीका होगा:

मुझे निम्नलिखित फ़ंक्शन हस्ताक्षर के साथ दो फ़ंक्शन बनाना होगा ...

वैसे भी, यहाँ अद्यतन कोड है:

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

#define STRMAX      20

// description of a car
struct car {
    char model[STRMAX];
    char color[STRMAX];
    char number[STRMAX];
};

// askfor -- ask user for something
void
askfor(const char *tag,char *ptr)
{

    printf("Enter %s: ",tag);
    fflush(stdout);

    fgets(ptr,STRMAX,stdin);

    // remove trailing newline [if it exists]
    ptr = strchr(ptr,'\n');
    if (ptr != NULL)
        *ptr = 0;
}

void
NewCar(struct car *cars,int *countptr)
{
    int carcount = *countptr;
    struct car *car = &cars[carcount];

    askfor("Model",car->model);
    askfor("Color",car->color);
    askfor("Number",car->number);

    carcount += 1;
    *countptr = carcount;
}

void
CarList(struct car *cars,int carcount)
{
    struct car *car;
    int caridx;

    for (caridx = 0;  caridx < carcount;  ++caridx) {
        car = &cars[caridx];
        printf("%d. Car: %s %s %s\n",
            caridx + 1, car->number, car->model, car->color);
    }
}

int
main(int argc,char **argv)
{
    int carcount = 0;
    struct car carlist[1000];
    char menu[STRMAX];

    // force out prompts
    setbuf(stdout,NULL);

    while (1) {
        askfor("\nNew Car(N)\nCar List(L)",menu);

        // stop program
        if ((menu[0] == 'q') || (menu[0] == 'Q'))
            break;

        switch (menu[0]) {
        case 'n':
        case 'N':
#if 0
            carcount = NewCar(carlist,carcount);
#else
            NewCar(carlist,&carcount);
#endif
            break;

        case 'l':
        case 'L':
            CarList(carlist,carcount);
            break;
        }
    }

    return 0;
}

हालांकि, आपके मूल कार्यों को देखते हुए, यह संभव हो सकता है कि हस्ताक्षर हो हों: void NewCar(void) और void CarList(void) और कार सूची चर वैश्विक होने चाहिए। एम> गुंजाइश।

यह चीजों को करने का एक कम लचीला और वांछनीय तरीका होगा, लेकिन यहां एक ऐसा संस्करण है जो सूचियों के लिए केवल वैश्विक चर का उपयोग करता है:

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

#define STRMAX      20

// description of a car
struct car {
    char model[STRMAX];
    char color[STRMAX];
    char number[STRMAX];
};

#if 1
int carcount = 0;
struct car carlist[1000];
#endif

// askfor -- ask user for something
void
askfor(const char *tag,char *ptr)
{

    printf("Enter %s: ",tag);
    fflush(stdout);

    fgets(ptr,STRMAX,stdin);

    // remove trailing newline [if it exists]
    ptr = strchr(ptr,'\n');
    if (ptr != NULL)
        *ptr = 0;
}

void
NewCar(void)
{
    struct car *car = &carlist[carcount];

    askfor("Model",car->model);
    askfor("Color",car->color);
    askfor("Number",car->number);

    carcount += 1;
}

void
CarList(void)
{
    struct car *car;
    int caridx;

    for (caridx = 0;  caridx < carcount;  ++caridx) {
        car = &carlist[caridx];
        printf("%d. Car: %s %s %s\n",
            caridx + 1, car->number, car->model, car->color);
    }
}

int
main(int argc,char **argv)
{
#if 0
    int carcount = 0;
    struct car carlist[1000];
#endif
    char menu[STRMAX];

    // force out prompts
    setbuf(stdout,NULL);

    while (1) {
        askfor("\nNew Car(N)\nCar List(L)",menu);

        // stop program
        if ((menu[0] == 'q') || (menu[0] == 'Q'))
            break;

        switch (menu[0]) {
        case 'n':
        case 'N':
#if 0
            carcount = NewCar(carlist,carcount);
#else
            NewCar();
#endif
            break;

        case 'l':
        case 'L':
#if 0
            CarList(carlist,carcount);
#else
            CarList();
#endif
            break;
        }
    }

    return 0;
}
2
Craig Estey 13 अप्रैल 2020, 19:06