עבור לתוכן

בעיה בתרגיל קליטת מייל בשפת C

Featured Replies

פורסם

אני צריך ליצור תוכנית הקולטת מהמשתמש מייל בודקת את תיקנותו(אם הוא נכתב כמו שצריך[לדוגמא @] ושומרת את המייל בתוך מערך מוקצה דינמית

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

תודה לכל מי שיכול לעזור :-)

פורסם
  • מחבר

כן

אבל אני די חדש בתיכנות בשפת C

לפי מה שאני יודע malloc מגדירה לי מערך מוקצה כאשר אני יודע מה הוא מספר האיברים שלי

אך הדבר הראשון שאני עושה הוא לקלוט מהמשתמש את האימייל... אני לא מבקש ממנו להכניס "כמה תווים האמייל שלך מכיל: ___"

אז אני קולט באמצעות getchar את הנתונים ומתחיל לבדוק כל תו שנכנס,

השאלה היא איך אני שומר את כל האימייל אחרי שכל התווים הוכנסו לתוך המערך?

פורסם

תתחיל מגודל X. אם הגעת לגודל הזה, תקצה מערך בגודל כפול (או + 10 או מה שבא לך), ותעתיק אליו את התווים שכבר קלטת מהמשתמש וחוזר חלילה.

פורסם

אין צורך להעתיק ידנית, בשביל זה נבראה הפונקציה realloc.

פורסם
  • מחבר

ניסתי לעשות את זה אבל הוא נותן לי שגיאה:

run-time check failure #3 - the variable 'newemail_arr' is being used without being initialized


#define N 10

char check_email(char email_c, char email_arr[], int corrent) {
char *newemail_arr;
int x;
int multiplayer=1;
if(!isdigit(email_c) && !isspace(email_c) && (isalpha(email_c) || email_c=='@')) {
/* allocate memory for array */
if(corrent>=(N*multiplayer)) {
multiplayer++;
newemail_arr=(char *)malloc((N*multiplayer)*sizeof(char));
if(newemail_arr==NULL) {
printf("could not allocate memory\n");
exit(1);
}
}
/* the end of - allocate memory for array */
email_c = tolower(email_c);
if(multiplayer > 1)
email_arr[corrent] = email_c;
else
newemail_arr[corrent] = email_c;
}
printf("\n");
if(corrent>=N) free(newemail_arr);
return 1;
}

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

פורסם
  • מחבר

אוקי השתמשתי בפוקנציה realloc

אבל בפעם השניה שהתוכנית משתמשת בה - התוכנה מציגה שגיאה:

expression: _CrtIsVaildHeapPointer(pUserData)

for information.......

בפעם הראשונה שהתוכנה מבצעת את הפוקנציה אין בעיה אך בפעם השניה התוכנית עושה שגיאה

הנה התוכנית:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define N 20

int create_email(char email_c, char email_arr[], int corrent, int *multiplayer) {
if(corrent == N*(*multiplayer)) {
(*multiplayer)++;
realloc(email_arr,N*((*multiplayer))*sizeof(char));
}
if(!isdigit(email_c) && !isspace(email_c) && (isalpha(email_c) || email_c=='@')) {
email_arr[corrent] = tolower(email_c);
return 1;
} else
return 0;
}

int main()
{
char c;
int i=0, x;
int *multiplayer;
int counter=1;
char *email_arr;
multiplayer = &counter;
/* allocate memory for array */
email_arr=(char *)calloc(N,sizeof(char));
if(email_arr==NULL) {
printf("could not allocate memory\n");
exit(1);
}
/* the end of - allocate memory for array */
while(((c=getchar()) != EOF) && c!='\n') {
i+=create_email(c, email_arr, i, multiplayer);
}
printf("\n");
for(x=0; x<i; x++)
printf("%c", email_arr[x]);
printf("\n");
return 0;
}

פורסם

אתה לא משתמש ב-realloc נכון. תקרא איך אמורים להשתמש בה.

אגב, שיטה יותר מומלצת היא כל פעם להגדיל את המערך פי 2, ולא להוסיף לו גודל קבוע כל פעם.

פורסם
  • מחבר

אז איך אני צריך להשתמש בה?

ניסתי כבר כמה וכמה דרכים

או שמופיעה שגיאה או שהתוכנית פשוט קורסת...

פורסם
  • מחבר

אוקי תודה הסתדרתי עם ה realloc

הבעיה היתה במקום אחר וגרמה לכמה בעיות בתוכנית ...

תודה :)

ארכיון

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

דיונים חדשים