עבור לתוכן

מחרוזות ב-C

Featured Replies

פורסם

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

אבל לא מצליח להבין מדוע לא עובד.

אני מאתחל מערך:{char *a[]={"blabla" ,"kakaka" ,"mimimi"

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

אני לא מצליח להשתמש בפונקציה strcmp בצורה נכונה כנראה.

תודה ויום טוב

פורסם

strcmp מחזירה 0 אם המחרוזות שוות, מספר חיובי אם התו הראשון ששונה בין המחרוזות גדול יותר במחרוזת הראשונה ומספר שלילי להיפך.

פורסם
  • מחבר

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

לולאה?? אם כן תראה לי איך...

פורסם
  • מחבר

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

#include <stdio.h>
#include <string.h>

int compare(const char *str1, const char *str2);
void swap (char *a ,const char *str1, const char *str2);


void main()
{
char *a[] = {"nir", "amos", "levi"};
int i, j;

for(i = 0; i < strlen(a); i++)
{
for(j = 1; j < i ; j++)
{
if(compare (a[j], a[j+1]))
{
swap(a,a[j], a[j+1]);

}
}
}
printf("The after sorting is:\n");
for (i = 0; i < strlen(a); i++)
{

printf("%s",a[i]); //הדפסת המערך הממוין

}
printf("\n");


}


int compare(const char *str1, const char *str2)
{
return strcmp(str1,str2);
}

void swap (char *a ,const char *str1, const char *str2) //פונקציה למיון המערך בסדר עולה
{
int i ,j;
char temp=0;
for (i = 0; i < strlen(a) - 1; i++) //לולאה שרצה עד האיבר האחרון -1
{
for (j = 0; j < strlen(a)- i -1; j++) // לולאה שתקטין את עצמה בלא לשנות את האיבר האחרון
{
if (a[j] > a[j+1]) // בדיקת זוג איברים סמוכים
{
temp = a[j];
a[j] = a[j+1]; //קידום האיבר הגדול ימינה
a[j+1] = temp;
}
}
}


}

פורסם

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

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

פורסם

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

יש לך שם לפחות שגיאה אחת: אתה מעביר את a (שהטיפוס שלו הוא char** אל תוך פונקצית swap שמקבלת char* ).

עוד הערה: האם יתכן שאתה מנסה להחליף את האותיות ממש במחרוזת, במקום להחיף רק את המצביעים במערך? ראשית, זה מיותר. שנית, זה באג. literal strings כלומר מחרוזות שהוגדרו כך "abc" נחשבות מחרוזות קבועות ואסור לשנות אותן.

פורסם
  • מחבר

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

אבל את ZIV את שם ראשון, מה הבעיה???

#include <stdio.h>
#include <string.h>

#define N 5

void main()
{
char *a[] = {"dog" ,"cat" ,"baby" ,"avi","ziv"};
int i ,j;
char *tempi[1]={0};

for (i = 0; i < N - 1; i++) //לולאה שרצה עד האיבר האחרון -1
{
for (j = 0; j < N - i - 1; j++)
{
if (strcmp(a[j] ,a[j+1]))
{
tempi[0] = a[j];
a[j] = a[j+1];
a[j+1] = tempi[0];
}
}
}
printf("The Alphabetic Order Is: \n");
for (i = 0; i < N; i++)
{
printf("%s \n",a[i]);
}


}

[br]פורסם בתאריך: 3.01.2009 בשעה 13:03:16


טוב הצלחתי לפתור את הבעיה: בשורה:if (strcmp(a[j] ,a[j+1]) )הוספתי אם שווה ל-1 כי אז באמת המחרוזת השנייה גדולה מהראשונה.

אז זה עובד, אבל היה עוד תנאי לשאלה והוא שהתכנית לא תבדיל בין אות קטנה לגדולה, יש פונקציה אחרת חוץ מ-strcmp??

פורסם
  • מחבר

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

#include <stdio.h>
#include <string.h>

void print( char *ary, int n);
void sort(char *ary, int n);

#define N 7

void main()
{
char *a[] = {"hello","there","bye","bee","list","locomotion","train"};

printf("The Original Array is:\n");
print(&a[0], N);
sort (&a[0] ,N);
printf("The After Sorting Array Is:\n");
print(&a[0], N);
}

void print( char *ary[], int n)
{
int i;

for ( i = 0; i < n; i++)
{
printf("%s\n",ary[i]);
}
printf( "\n" );
}

void sort(char *ary[], int n)
{
int i ,j ,x;
char *tempi;
char *str1;
char *str2;

for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
str1 = ary[j];
str2 = ary[j+1];
x = mystrcmp( str1, str2);

if (x == 1)
{
tempi = ary[j];
ary[j] = ary[j+1];
ary[j+1] = tempi;
}
}
}
}

int mystrcmp(char *s1 ,char *s2)
{
return strcmp(s1 ,s2);
}

[br]פורסם בתאריך: 3.01.2009 בשעה 18:37:57


אגב, שיניתי את הפונקציה ל-stricmp אבל הפלט לא תקין הוא משום מה לא מזהה את ההבדל...

ארכיון

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

דיונים חדשים