मैं एक साधारण पार्किंग व्यवस्था कोड लिखने की कोशिश कर रहा हूं, मैं क्षमता को 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;
}
}
जब मैं शून्य का उपयोग नहीं करता, तो कोड काम करता है लेकिन मुझे शून्य का उपयोग करना होगा
मुझे जो आउटपुट चाहिए उसका उदाहरण;
1. Car Red Jeep FGX9425
2. Car Yellow Truck OKT2637
3. Car Green Sedan ADG4567
....
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;
}