ABA


"בעיה לא הגיונית עם מחרוזת ב C."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10240 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10240
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:36   22.01.11   
אל הפורום  
  בעיה לא הגיונית עם מחרוזת ב C.  
 
   אני קולט מחרוזת.. נניח aaa.

אני מדפיס את המחרוזת אז הוא מדפיס aaa
ואז אני מבקש ממנו להדפיס את המחרוזת במקום הראשון.. ובמקום להדפיס a הוא מדפיס לי אות בג'יבריש... ככה גם לגבי כל מקום אחר במחרוזת..

הוא יודע רק מהי המחרוזת השלמה והוא לא מצליח לגשת לאף אחד מהתאים עצמם במחרוזת...

מה זה הדבר הזה? בחיים לא נתקלתי בשגיאה כזאת.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  שאני אבין ldan192  22.01.11 00:48 1
     אני אומר דבר כזה ShocKi  22.01.11 00:56 2
         הגיוני :) Dotan  22.01.11 01:02 3
             גם %c לא עובד.. ShocKi  22.01.11 01:07 4
                 מוזר... עם איזה קומפיילר אתה עובד? Dotan  22.01.11 01:20 5
                     זה הקוד ShocKi  22.01.11 01:33 7
                         אצלי בVS2008 זה לא מתקמפל בכלל... Dotan  22.01.11 01:37 9
                             מה? אני עובד עם vs 2008 וזה מתקמפל מצויין.. ShocKi  22.01.11 01:38 10
                                 C++, Win32, Console Application, Empty Project Dotan  22.01.11 01:40 11
                                     למה שמרת cpp? שומרים c ShocKi  22.01.11 01:41 12
                                         עכשיו זה מתקמפל אבל עדיין ה-מ-ו-ן הערות. Dotan  22.01.11 01:45 13
                                             אסור לנו לעשות cpp ShocKi  22.01.11 01:50 14
                                                 מותר לך, אבל נתחיל במשהו אחר: Dotan  22.01.11 01:55 15
                                                     תבורך ShocKi  22.01.11 02:01 16
                                                         מה הכוונה? Dotan  22.01.11 02:03 17
                                                             תודה... שאלה נוספת ShocKi  22.01.11 02:53 18
                                                                 מה הכוונה לבודד? Dotan  22.01.11 14:05 21
                                                                     אסור לנו.. ShocKi  22.01.11 14:38 22
                 אתה עושה קצת סלט... ldan192  22.01.11 01:28 6
                     לא הבנתי אחינו. ShocKi  22.01.11 01:35 8
                         string ב C לא שמור. Yariv-H 22.01.11 09:05 19
                         כשאתה שומר char * str ldan192  22.01.11 10:46 20

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:48   22.01.11   
אל הפורום  
  1. שאני אבין  
בתגובה להודעה מספר 0
 
char *s = "aaa";
printf("WORKS - %s\n", s);

printf("DOESNT WORK - %s\n", &s);
או למה אתה מתכוון?

כי אם אתה עושה משהו כזה:
printf("DOESNT WORK - %s\n", (char*)s);
אז תחשוב שהוא מסתכל על הכתובת בזכרון כעט המחרוזת...
מכיוון ש-
sizeof(char)==1
והמחרוזת היא מאורך 3
אז אתה ניגש לכתובת
'0xXYZ's''s''s

כאשר
XYZ
זבל כלשהו


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:56   22.01.11   
אל הפורום  
  2. אני אומר דבר כזה  
בתגובה להודעה מספר 1
 
  

gets(string);
size=strlen(string);
printf("%s",string(1));
printf("%s",string(size));
puts(string);

הסוגריים מרובעים כמובן, פשוט כאן הוא מוריד אותם...

נניח כי הקלט הוא aaa.
בשני הפקודות של ה print הוא מדפיס אות בג'יבריש.. משהו שלא שייך לקלט.. וכשאני עושה debug הוא אומר שהוא לא יכול לגשת לתא הזה.
ובהדפסה האחרונה זה עובד.

אני לא מבין מה הוא רוצה.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:02   22.01.11   
אל הפורום  
  3. הגיוני :)  
בתגובה להודעה מספר 2
 
   כשאתה מדפיס מחרוזת אתה נותן %s ל-printf, אם אתה מדפיס תא מסוים, זה מחזיר לך בתכלס char שאותו מדפיסים עם %c.

ככה שמשהו כזה אמור לעבוד:



char* string = new char[100];
gets(string);
int size=strlen(string);
printf("%c",string[1]);
printf("%c",string[size]);
puts(string);

אגב, עדיף להשתמש ב-cout ו-cin לקלט ופלט, הרבה יותר נוח ולא צריך לדאוג לפורמט או לסוג.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:07   22.01.11   
אל הפורום  
  4. גם %c לא עובד..  
בתגובה להודעה מספר 3
 
   הוא עדיין מדפיס ג'יבריש. ואין לי מושג על cin והשני.. לא למדנו את זה.

אני חושב שזו שגיאה בקומפיילר..
לפני רגע כתבתי תוכנית שבה פקודות דומות עבדו מצויין... ועכשיו הפקודות האלה לא עובדות... ניסיתי לפתוח פרויקט חדש וזה גם לא עוזר..
שלחתי את הקוד הזה לחברים שלומדים איתי הם הריצו וזה עובד להם יופי..

אני לא מבין מה המחשב רוצה.


אני האמת בכלל לא צריך הדפסות.. אני צריך להשוות מקום מסוים במחרוזת לתו מסוים... מכאן זה התחיל שההשוואה הזאת לא עבדה.. אז הדפסתי מה יש במקום הזה כדי לראות למה ההשוואה לא עובדת.. ואז גיליתי שבכלל במקום הזה יש ג'יבריש... הקומפילר למעשה לא מחזיר שגיאה אבל במצב debug הוא אומר שאיאפשר לגשת לתא כזה .. למשל string(1) (עם סוגרים מרובעים).
לטענתו, זו גישה לא נכונה...


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:20   22.01.11   
אל הפורום  
  5. מוזר... עם איזה קומפיילר אתה עובד?  
בתגובה להודעה מספר 4
 
   וcout/cin זה די פשוט,
תוסיף את הספריה iostream ותשתמש בnamespace std.

לדוגמא:



#include <iostream>

using namespace std;

int main()
{
char* str = new char[100];
cin >> str;
cout << "First cell: " << str[0] << endl;
cout << str;

return 0;
}


אבל זה יותר c++, אם אתה בC תשאר עם printf לבינתיים בתור התחלה.

ולבעיה עצמה - אתה עובד עם Visual Studio? אם כן תנסה לעשות Rebuild All קודם (Build למעלה ואז Rebuild All או Alt+B+E).
מוזר מאוד, אם אתה יכול תביא את הקוד המלא שלך, אולי יש משהו אחר בדרך.

וד"א סתם לנוחיות - יש לך בצד ימין פה מתחת לסמיילים "המרת סוגריים מרובעים" - זה מתקן את הבעיה איתם


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:33   22.01.11   
אל הפורום  
  7. זה הקוד  
בתגובה להודעה מספר 5
 
   ערכתי לאחרונה בתאריך 22.01.11 בשעה 01:36 בברכה, ShocKi
 

#include <stdio.h>
#include <string.h>
#define length 100
void scan_parameters (char *string[length]);
void main()
{
char string[length];
scan_parameters(string);
printf("\n");
printf("If you see this MSG the string is OK");
puts(string);
getch();
}
void scan_parameters (char *string[length])
{
//scan parameters
int exit,size,i;
char temp[length];
do
{
exit=1;
printf("Enter text up to %d letters: ",length-1);
flushall();
gets(string);
size=strlen(string);
if (size>length-1)
{
printf("\nInput is too big, please follow guidelines\n");
exit=0;
}
else
if (strstr(string," ")!=NULL)
{
exit=0;
}
else
if ((string[size-1]!='?')&&(string[size-1]!='!')&&(string[size-1]!='.'))
{
exit=0;
}
else
{
for (i=0;i<size-1;i++)
{
if ((string[i]<'A') && (string[i]>'z')&&(string[i]!=' '))
{
exit=0;
break;
}
}
}
}
while (exit==0);
}

המטרה של הקוד היא לסנן טקסטים לא תקינים.
טקסט תקין זה טקסט שיש בו רווח אחד בין מילה למילה, שהמילים בו מורכבות מאותיות כאשר מותר שיהיה פסיק בין מילים והטקסט חייב להסתיים בנקודה, סימן קריאה או סימן שאלה. השתמשתי ב exit בתור flag.. איפה שמצאתי בעיה שיניתי את הערך ב exit כדי לדעת אם לעצור את הלולאה או שהיא צריכה להמשיך כי יש בעית חוקיות בקלט.

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:37   22.01.11   
אל הפורום  
  9. אצלי בVS2008 זה לא מתקמפל בכלל...  
בתגובה להודעה מספר 7
 
   המון שגיאות, כמו המרה של char שזה קבוע על ה-stack לchar* שזה בכלל הקצאה דינאמית.

וכמו שidan192 אמר לך בתגובה מעל, תשנה את השם מstring כי זה קצת בעייתי בC.

ויש המון שגיאות של המרות.

תפעיל את זה בVisual Studio ותראה בעצמך, יש המון קוד לא תקין, או הקומפיילר שאתה משתמש בו "מרחם" מידי ולא מעיר לך, אבל יש 17 שגיאות בנסיון קימפול הראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:38   22.01.11   
אל הפורום  
  10. מה? אני עובד עם vs 2008 וזה מתקמפל מצויין..  
בתגובה להודעה מספר 9
 
   אתה בטוח שפתחת את הפרויקט ל c..?
win32 console וכו'..?
שמרת את הקוד כ .c ..?

אולי פתחת בטעות פרויקט של c++?

הנה הBUILD
http://gyazo.com/4f1612a4a441cd388fe2aa7e1c48e1a4.png


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:40   22.01.11   
אל הפורום  
  11. C++, Win32, Console Application, Empty Project  
בתגובה להודעה מספר 10
 
   העתקתי והדבקתי את מה ששלחת לי.

זה מה שקיבלתי כשניסיתי לקמפל:

הפרויקט הוא C++ אבל הקוד שכתבת את C נקי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:41   22.01.11   
אל הפורום  
  12. למה שמרת cpp? שומרים c  
בתגובה להודעה מספר 11
 
   אם אתה עושה cpp זה של c++

http://gyazo.com/4ff53eca4fb6b0f723c03782af123163.png


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:45   22.01.11   
אל הפורום  
  13. עכשיו זה מתקמפל אבל עדיין ה-מ-ו-ן הערות.  
בתגובה להודעה מספר 12
 
   אפשרות להתעלם מחלק, אבל עדיין הקוד שכתבת לא תקני.

char* str לדוגמא זה מצביע char למערך בגודל 100, זה אמור להיות מערך בגודל 100 או מצביע char*, לא גם וגם.

תשנה אצלך לCPP ואז הוא יתייחס באמת לבעיות כאלה, משום מה בC הוא "מרחם" מידי :|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:50   22.01.11   
אל הפורום  
  14. אסור לנו לעשות cpp  
בתגובה להודעה מספר 13
 
   כל מי שעשה ככה פוסלים לו מיד את השאלה ורושמים לו "זה קורס בשפת C לא בשפת C++".

ולא הבנתי מה הבעיה...
הגדירו לנו שה main חייב להיות קצר וכל דבר שעושים חייבים לעשות בפונקציות עזר... איך אני אמור לעשות את זה... אם לא ככה? אני לא חושב שיש דרך אחרת.

לגבי ההערות אני לא מבין מה הם רוצים, ממתי אסור לי להשוות קוד אקסי לקוד אסקי.. מה הבעיה עם זה?


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   01:55   22.01.11   
אל הפורום  
  15. מותר לך, אבל נתחיל במשהו אחר:  
בתגובה להודעה מספר 14
 
   char* - מצביע לכתובת בזכרון שבה מתחיל רצף של charים שמסתיים בNULL Ternimated (שזה \0).
char str[10] - מערך בגודל 10.
אתה לא יכול גם * וגם לציין גודל!
הפונקציה שלך אמורה להיות:

void scan_parameters (char string[], int arrsize)

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

ואז תשים לב שעוברת לך מחרוזת אמיתית בDebug ולא BadPtr שאתה מקבל שם עכשיו.

או שאתה יכול:


void scan_parameters (char* string)

ואתה יכול להעביר לCPP רק כדי לראות מה השגיאות, תתקן, תבין ואז תחזיר.

בנוגע להשוואות - אחרי שתתקן את ההצבעה למערך שלך לא תהיה לך בעיה כי אז אתה תקבל char באמת כשתעשה [] ולא int ואז ההשוואה שלך תהיה לא תקינה.

תבין את ההבדל - יש char* ויש char str[] - אי אפשר גם וגם (טכנית, אפשר, אבל זה כבר יותר מתקדם ממה שאתה צריך).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   02:01   22.01.11   
אל הפורום  
  16. תבורך  
בתגובה להודעה מספר 15
 
   אגב, אני אף פעם לא הבנתי את הרעיון של העברת משתנים.
אני יכול להבין למה אני צריך להעביר משתנה שהוא מקומי בתוך ה MAIN לפונקציה.. אבל גם בתרגילים שפתרנו לנו בכיתה.. הם הגדירו ב define בתחילת התוכנית איזשהו ערך ואז הם כל פעם שולחים אותו לפונקציה.. בשביל מה זה?!


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   02:03   22.01.11   
אל הפורום  
  17. מה הכוונה?  
בתגובה להודעה מספר 16
 
   אם אתה רוצה להשתמש במשתנה מסוים בתוך פונקציה יש לך 2 אופציות:
- משתנה גלובלי
- להעביר אותו כפרמטר לפונקציה.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   02:53   22.01.11   
אל הפורום  
  18. תודה... שאלה נוספת  
בתגובה להודעה מספר 17
 
   יש לי איזשהי תת מחרוזת שנמצאת בתוך משפט.
אני יודע שהתת מחרוזת הזאת נמצאת בין רווח לרווח...
אני צריך לבודד אותה ולבדוק אם היא מופיעה פעם נוספת במחרוזת.
איך אני מבודד אותה..?
אני רוצה להוציא אותה לתוך משתנה נוסף...


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dotan  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.10.03
2849 הודעות, 2 פידבק
   14:05   22.01.11   
אל הפורום  
  21. מה הכוונה לבודד?  
בתגובה להודעה מספר 18
 
   אתה יכול להשתמש בstrtok, היא מקבלת מחרוזת ו-tokens (שזה ה"מפרידים" שלך) ובלולאה אתה מקבל כל פעם מחרוזת, לדוגמא אם יש לך:
a,b,c,d
ואתה משתמש בפסיק ב-token אז תקבל מחרוזות מפרדות: a b c d

תקרא על זה, זה נחמד :} אם לא תצליח אני אביא לך קוד לדוגמא


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   14:38   22.01.11   
אל הפורום  
  22. אסור לנו..  
בתגובה להודעה מספר 21
 
   אם היה מותר לנו להשתמש בפונקצית ספריה הזאת.. לא הייתה שאלה בכלל..
הם רוצים לראות שאני יודע לבודד מילה...

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

העלמתי את כל הפסיקים מהמשפט כך שעכשיו יש לי רווח אחד ויחיד בין מילה למילה עם נקודה בסוף המשפט..

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

זה האלגוריתם שאני מתכנן.. אבל אני לא מצליח לבודד אפילו את המילה הראשונה.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   01:28   22.01.11   
אל הפורום  
  6. אתה עושה קצת סלט...  
בתגובה להודעה מספר 4
 
קודם כל, string צריך להיות מטיפוס char* (למרות שזה לא חכם להשתמש ב-string כי לך תדע אם זו לא מילה שמורה בספריה שאתה משתמש בה.
תרשום str במקום.

שני כל, טיפוס char* זה טיפוס של מערך של צ'ארים.
מה ש-printf של %s עושה זה בעצם
for (int i=0; s[i] != '\0'; ++i) printf("%c", s[i]);
כמובן שברמה אטומי באסמבלי, אבל רק למען הרעיון...

ברגע שאתה נותן לו
טיפוס
char
זה בעיניי, קודם כל, צריך לתת לך שגיאת קומפילציה,
אבל בלי קשר, גם אם תבצע קאסטינג בכוונה כמו שרשמתי למעלה - אתה מפספס את הכתובת וניגש לכתובת לא חוקית (הוא מסתכל על זה כ-32 בתים של פויינטר) ובכלל מדפיס לך טווחי זכרון לא חוקיים


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   01:35   22.01.11   
אל הפורום  
  8. לא הבנתי אחינו.  
בתגובה להודעה מספר 6
 
   זה לא מילה שמורה.. השתמשתי בה הרבה.. ואילו הייתה שמורה הוא היה צובע אותה בכחול.

ה string שלי הוא באמת מטיפוס *char.

כל מה שכתבת אחרי זה.. לא הבנתי למה אתה מתכוון.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   09:05   22.01.11   
אל הפורום  
  19. string ב C לא שמור.  
בתגובה להודעה מספר 8
 
   string ב c++ כן שמור.
צריך להכניס אתה הספרייה שלה ,
מה שאמרו לך פה שלא תתרגל להשתמש בה כי בשפות אחרות זה יעשה לך בעייה
זה כמו שתגדיר משתנה שהוא מספר בשם int

לא עושים דברים כאלו למען הסדר הטוב והכאבי ראש שמגיעים אחרי זה =]



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   10:46   22.01.11   
אל הפורום  
  20. כשאתה שומר char * str  
בתגובה להודעה מספר 8
 
מה אתה שומר בעצם שם?
אתה שומר דבר שנראה מהצורה 0x982343 שמצביע לכתובת הנמוכה בזכרון בה מאוחסנים ה-char-ים.

כשאתה משתמש ב-%s אתה בעצם אומר לקומפיילר לגשת לכתובת הנ"ל
ושם להתחיל לקרוא char-char.

כשאתה מבצע %s על [char[0, (למשל), אתה בעצם אומר לקומפיילר שתוכן התא בכתובת הנ"ל - הוא בעצם כתובת למקום אחר בזכרון שם נמצא מערך ה-char-ים.

כלומר
**str במקום מה שהתכוונת, ומכיוון שאתה ניגש, לאיזו כתובת שקרית - כמובן שתראה הרבה זבל.

בשביל לראות תו יחיד אתה צריך, כפי שהסבירו לך, להשתמש ב-%c.
ככה הוא אומר, "אה, הקלט שהכנסת לי זה כבר התו המבוקש, ולא שאני צריך להסתכל בכתובת של מה שנתת לי ולקרוא את כל התווים", ולכן זה כן יעבוד.


בברכה,
עידן


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

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

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



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