עבור לתוכן

בעיה עם מחרוזות במבנים שפת C

Featured Replies

פורסם

שלום חברים.

מה שיש בקוד לא משנה (את הקוד קיבלתי פחות או יותר כמו שהוא לתרגיל בית)

מה שבמודגש כרגע הם הדברים הרלוונטיים.

סך הכל מה שאני מנסה לעשות הוא להעתיק מחרוזת הנקלטת ע"י המשתמש לתוך מחרוזת הנמצאת בתוך STRUCT הנקרא PIC אבל משום מה כל נסיונותיי להעתיק את המחרוזת המתקבלת ע"י המשתמש למחרוזת ב STRUCT כושלים בהודעת קריסה תוך כדי התכנית.

רוב הדברים שיש בקוד הם רק לבדיקה והרבה דברים מיורקים כי הם לא חשובים כרגע, אבל אם מישהו יוכל להגיד לי את הסיבה (סביר להניח האידיוטית) למה הוא קורס אני אודה לו מאד!!!!

להלן הקוד הבא:


#include <conio.h>
#include <string.h>

#pragma warning (disable : 4996)

#define SIZE 256

///The Structs

///Creating the Picture
[b]typedef struct picture
{
int height;
int width;
char* data;

} PICTURE;
////[/b]

///Sequence to help compressing
typedef struct sequence
{
char c;
int times;

} SEQUENCE;
///

///Compress
typedef struct compressed_pic
{
int height;
int width;
SEQUENCE* data;

} COMPRESSED_PIC;
///

///End of the Structs

///Functions header
COMPRESSED_PIC CompressPicture(PICTURE p);
///End of headers

void main()
{
int exit=1;//flag for exit
int OP;//The operation for switch

///veriables for case 1:
int i,j;
[b]PICTURE PIC={0,0,"abcdefg"};///the name of struct in main[/b]
c[b]har tempstr[SIZE];///temp string for PIC.data veriable[/b]
///end of veriables for case 1

while(exit)//for the user to be able to exit the prog
{

do
{
printf("\n\t *** MENU *** \n");
printf("\nPress 1 to draw picture\n");
printf("\nPress 2 to read picture\n");
printf("\nPress 3 to save picture\n");
printf("\nPress 4 to compress picture\n");
printf("\nTo EXIT press 0\n\n");
scanf("%d",&OP);

}while(OP!=1 && OP!=2 && OP!=3 && OP!=4 && OP!=0);//to continue the menu showing

switch(OP)
{
[b]
///Creating the picture
case 1:
{
printf("\n***Creating the picture: ***\n");
printf("\nPlease enter the width of the picture: ");
scanf("%d",&PIC.width);
printf("\nPlease enter the height of the picture: ");
scanf("%d",&PIC.height);
printf("\nEnter the picture data line by line:\n");

for(i=0 ; i<PIC.height ;i++)
{
printf("\nline %d: ",i+1);

for(j=0 ; j<PIC.width ; j++)
{
tempstr[j]=getche();///get the chars by length with enter
}
tempstr[j]='\0';///need to know when to finish the string

printf("\n%s\n",tempstr);///for check only
printf("\n%s\n",PIC.data);

//if(i==0)///for the first time only
strcpy(PIC.data,tempstr);

//if(i!=0)///for every other then first time
//strcat(PIC.data,tempstr);

printf("\n%s\n",PIC.data);
[/b]
}

break;
}
/// End of Creating the picture

case 2:
{
break;
}

case 3:
{
break;
}

case 4:
{
break;
}

case 0:
{
exit=0;
printf("\n Good bye!\n\n");
break;
}

}///end of switch

}///end of while

}///End of main
#include <stdio.h>

תודה מראש :)

עריכה: אגב למי שאין כוח להסתכל בכל הקוד (אני יודע שלי לא היה במקומכם)

זו השורה שגורמת לקומפיילר לקרוס תוך כדי התכנית

strcpy(PIC.data,tempstr);

פורסם

טוב, אז אתה כמה פעמים עצלן

1) כמו שראית, ההדגשות שלך לא עובדות בתוך התגיות של code אבל לא הסרת אותן. (אבל סחטיין על הנסיון).

2) גם על פי הודאה שלך

3) לא התחשק לך לאתחל את PIC.data

4) כדאי לצרף את הודעת השגיאה הצפציפית

דע לך כי למעשה התוכנית יכלה להתעצל ולהחליט שבא לה לנוח כבר בהוראה

printf("\n%s\n",PIC.data)

אתה פונה לכתובת לא מאותחלת.

הפתרון הוא כמובן לא לתכנת ואז לא יהיו לך כל הבעיות המטרידות והמעיפות האלו.

ד"א במיוחד אהבתי את ההערה הבאה בקוד

char tempstr[SIZE];///temp string for PIC.data veriable

שים לב וזה חשוב: ההערות שתכתוב לעולם לא יגרמו למחשב לעשות מה שאתה רוצה. אך ורק הקוד שתכתוב יכול להשיג את המטרה. (או במילים אחרות, יכולתי לכתוב בהערה שאני מלכת אנגליה וזה היה נכון באותה המידה. או במילים אחרות אחרות אין קשר בין ההערה שכתבת למה שקורה בתוכנית)

אני מתנצל במלרע על הסרקזם. שיהיה בהצלחה!

פורסם

nsofi צדק בזה שלא אתחלת את PIC.data.

יש 2 אפשרויות:

1) הקצאה דינאמית - אתה צריך למצוא את הגודל את tempstr, (נניח שהוא יהיה ב-PIC.width * PIC.hright ), ואז להקצות לפיו ע"י


PIC.data = (char *)malloc(PIC.height * PIC.width + 1);

רק שים לב שבשיטה הזו תצטרך לעשות free בסוף התוכנית (או כשתסיים עם התמונה הזו).

2) להקצות את המערך סטטית (ע"י נתינת אורך מקסימאלי שהתמונה תוכל איי פעם לקבל) בשורת ההגדרה של הSTRUCT.

ד.א. יש מצב שה- data לא אמור להכיל בכלל טקסט אלא נתונים בינארים? אם כן תצטרך לשנות קצת את הקוד שלך.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים