ABA


"שאלה של מתחילים בקשר לקלט למחרזות C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15237 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15237
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   08:07   20.03.09   
אל הפורום  
  שאלה של מתחילים בקשר לקלט למחרזות C  
 
   שלום..מצטער שאני מציק כאן אבל אני לא מצליח להסתדר עם משהו ב C..

void main()
char* str;
str=(char*)malloc(3*sizeof(char));//3 bytes of memory
input(str);

void input(char* str)
{
//כאן אני רוצה לקלוט למחרוזת 3 מספרים כאשר זה יראה ככה מספר רווח מספר כלומר "4 5" לדוגמא.
int size=3;
char helparr="223";
while(אני רוצה תנאי שכאשר יודפס "0 0" אז הוא לא יקלוט יותר)
{
כמובן בכל סיבוב לעשות הקצאה נוספת בגודל size..
ובקליטה נגיד שאני רוצה אחרי שקלטתי את ה 3 תוים לשים עוד תו של רווח בסוף כל קליטה.
ניסיתי באמצעות:
scanf("%s ",str);
וניסיתי לשים עוד מערך שידע לטפל לי בתנאי של הלולאה כלומר מערך בגודל של 3 שכאשר
helparr!="0"&&helparr!=" "&&helparr!="0"
אני די חדש ב C
ועדיין לא כ"כ מסתדר עם ההקצאות והקליטות לתוך מערך.
אני רוצה שהמערך הסופי יראה ככה לדוגמא
str="3 4 2 3 3 2 0 0";


תודה רבה!


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  קודם כל, אתה צריך לשלוח כתובת לזכרון ולא תוכן ldan192  20.03.09 11:06 1
     אחלה VeNom  20.03.09 11:34 2
         חזרתי. הםם זה תכנות מאוד מסוכן בצורה הזו. מי אמר ldan192  20.03.09 13:44 3
             תודה אבל שמע אתה רחוק ממה שהייתץי צריך לעשות VeNom  20.03.09 16:29 4

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:06   20.03.09   
אל הפורום  
  1. קודם כל, אתה צריך לשלוח כתובת לזכרון ולא תוכן  
בתגובה להודעה מספר 0
 
לפונקציה Input. בצורה שאתה עשית אתה שולח בעצם את התוכן של התא ה-0 של "מערך ה-str".

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:34   20.03.09   
אל הפורום  
  2. אחלה  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 20.03.09 בשעה 11:41 בברכה, VeNom
 
אז במיין שלי קיימת מחרוזת..הקצאתי לה דינאמית 4 מקומות(כל סיבוב אני צריך לקלוט 3 תוים מהמשתמש ולהוסיף רווח בסוף).
נניח אני צריך לקלוט משהו כזה:

1space2space

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

int sizepair=4;//כל סיבוב 4 תוים נקלטים
char helpstr[]="353";//אתחול עם סתם משהו שיהיה שונה מהתנאי
int i=0;//אינדקס
while((helpstr[]!='0')||(helpstr[]!=' ')||(helpstr[]!='0'))//תנאי עצירה שבחרתי כאשר המשתמש מכניס 0רווח0 זה מציין סוף קלט
{
gets(helpstr);//קולט לתוך מחרוזת עזר 3 תוים בדיוק
str=(char*)realloc(str,sizepair*sizeof (char));//הקצאת זכרון שכל פעם תעשה מחדש
str[]=helpstr[];//העתקה ממחרזות עזר למחרוזת קלט הסופית שאני צריך לייצר
str[]=helpstr[];
str[]=helpstr[];
str[]=" ";//הוספת התו רווח בסוף
i+=4;//הקפצת האינדקס
}
עכשיו שאני רואה יש בעיה עם התוכן בתוך הסוגרים המרובעים אז בעקרון בלולאה כתוב
stri,stri+1,stri+2,stri+3;helpstr0,helpstr1,helpstr2
והתנאי כניסה ללולאההוא
helpstr0,helpstr1,helpstr2
בהתאמה ..


אני יודע שיצא לי קוד מגעיל אני פשוט מאוד לא מכיר את כל הפונקציות ב C עדיין..
strcpy לא מבצע טוב את ההעתקה ממחרוזת למחרוזת(כי הוא כל פעם עושה אוברייט ולא ממשיך את המחרוזת בעצם לגודל אינסופי-שכאשר המשתמש מכניס 0רווח0 נעצרת ההקצאה הדינמית).
עכשיו אני די בבעיה מכייון שזה עובד די טוב העסק אבל ה realloc יוצר לי תו דומה לזה:">" שבעצם כל התוכנית(ארוכה) שבניתי לא הייתה בנויה עליו.
עשיתי שימוש ב strtok שיקרא מהמחרזות עד הdelimter שבחרתי שיהיה רווח(עשיתי את התוכנית מבלי לקלוט שום דבר מהמשתמש..כלומר עם מחרוזת שהכנסתי ידנית בעת אתחול המשתנה)..
אני די חדש בתכנות ובמיוחד ב C ככה שאני די אשמח לאיזה הכוונה..
תודה רבה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:44   20.03.09   
אל הפורום  
  3. חזרתי. הםם זה תכנות מאוד מסוכן בצורה הזו. מי אמר  
בתגובה להודעה מספר 2
 
ערכתי לאחרונה בתאריך 20.03.09 בשעה 14:35 בברכה, ldan192
 
שהקלט באמת באורך 3? וגם אני עדיין לא בטוח שהבנתי כל-כך מה הקוד צריך לעשות.
אם הבנתי נכון אתה אמור לקבל תו-רווח-תו ולהוסיף רווח בסוף? ואז מה אתה עושה עם הטקסט הזה? הכי פשוט (לא בדקתי בקומפיילר אז יתכנו טעויות) לרשום דבר כזה:


#include <stdio.h>

int fn(char* str);
int main(){
char* str = NULL;
str = (char*)malloc(sizeof(char)*5); //5 because of the '\0' in the end of a string
while(fn(str))
printf("%s\n", str);
free(str);
return 0;
}
int fn(char* str){
int a = 0;
gets(str);
a=strlen(str);
if(a > 3)
return 0;
else{
str[a] = ' '; //space
str[a+1] = NULL; //end of line
}
return 1;
}


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   16:29   20.03.09   
אל הפורום  
  4. תודה אבל שמע אתה רחוק ממה שהייתץי צריך לעשות  
בתגובה להודעה מספר 3
 
   עליתי כאן על דרך טובה..אני בעקרון אמור להיערך לשורת תוים אני בהתחלה רציתי לחלק לקטעים ואז לעשות העתקה..אבל עליתי על שיטה יותר טוב עם getchar ועם realloc אני מניח שהיא תעבוד רק צירך לשבת על זה קצת..
אם כבר אנחנו מדברים יש לך איזה רפרנס מומלץ ללמידת c?עדיפות לעברית לא כי האנגלית שלי גרועה אלא כי בד"כ האנגלית לא הכי מובנת בהסברים שלהם(יוצאים מנק' הנחה שאתה שולט כבר בתכנות בשפת C) לפחות ברוב האתרים שנתקלתי..
תודה רבה בכל אופן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net