שפת C/מחרוזות/תרגילים

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

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

פתרון
#include <stdio.h>

int main()
{
  char name[10];

  printf("Please enter your name: \n");
  scanf("%s", name);
  printf("Hello, %s!",name);

  return 0;
}


שרשור שלוש מחרוזות עריכה

כתבו תוכנית שקולטת מהמשתמש 3 מחרוזות, משרשרת את שלושתן למחרוזת אחת ומציגה אותה על המסך. הניחו שכל אחת משלוש המחרוזות הנקלטות היא בגודל 15 לכל היותר. שימו לב לא לדרוס זיכרון!


פתרון
#include <stdio.h>
#include <string.h>

int main()
{
  char str[3][15];
  char outputString[50];
  int i;

  for (i=0; i<3; ++i)
  {
    printf("Please insert string number %d\n",i+1);
    scanf("%s",str[i]);
  }

  strcpy(outputString,str[0]);
  strcat(outputString,str[1]);
  strcat(outputString,str[2]);

  printf("%s\n",outputString);

  return 0;
}


היפוך מחרוזת עריכה

כתבו תוכנית שמקבלת מחרוזת מהמשתמש, ויוצרת מחרוזת חדשה, שמכילה את המחרוזת הראשונה מהסוף להתחלה. כלומר, אם המשתמש הקליד "Shalom" המחרוזת השנייה תהיה "molahS". הניחו שאורך המחרוזות הנו לכל היותר 15.

זכרו שמחרוזת היא פשוט מערך של תווים, ואפשר לגשת לכל תו בה ע"י [str[i כאשר str שם המחרוזת. זכרו גם לדאוג שיהיה תו סיום מחרוזת '0\' במחרוזת החדשה.


פתרון
#include <stdio.h>
#include <string.h>

int main()
{
  char original[15];
  char reversed[15];
  int i, end_index;

  printf("Please insert a string to reverse\n");
  scanf("%s",original);

  end_index = strlen(original) - 1;
  for(i = end_index; i >= 0; --i)
	reversed[end_index-i]=original[i];

  reversed[end_index + 1] = 0;

  printf("%s\n",reversed);

  return 0;
}


היפוך מחרוזת ללא מחרוזת עזר עריכה

כתבו תוכנית דומה לקודמת: היא קולטת מחרוזת מהמשתמש, ואז הופכת אותה, אך הפעם בלי להשתמש במחרוזת נוספת.
רמז: השתמשו בשני אינדקסים בלולאה. אחד מהם יתחיל מהתו הראשון במחרוזת, ואחד מהתו האחרון. (נזכור שבתא האחרון יש '0\').


פתרון
#include <stdio.h>
#include <string.h>

int main()
{
  char str[15];
  char temp;
  int i,end_index;

  printf("Please insert a string to reverse\n");
  scanf("%s",str);

  end_index = strlen(str) - 1;
  
  for (i=0; i <= end_index/2; ++i)
  {
    temp=str[i];
	str[i]=str[end_index-i];
	str[end_index-i]=temp;
  }

  printf("%s\n",str);

  return 0;
}


מחיקת רווחים ממחרוזת קלט עריכה

 

שקלו לדלג על נושא זה

תרגיל זה עושה שימוש בפונקציית gets, שלא נלמדה במדריך זה. אם אינך מכיר את השימוש בה, מומלץ לדלג על תרגיל זה.



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


פתרון
#include <stdio.h>
#include <string.h>

int main()
{
  char str[15];
  int i, pos=0;

  printf("Please insert a string from which to remove spaces.\n");
  gets(str);/* remember - never use gets in real life! */

  for (i=0; i<strlen(str); ++i)
    if (str[i] == ' ')
      str[pos++]=str[i];

  str[pos++]='\0';

  printf("%s\n",str);

  return 0;
}


פונקציה דומה ל-strlen עריכה

כתוב פונקציה בשם strlen_without_h המקבלת מחרוזת, ומדפיסה את מספר התווים בה שאינם האות 'h'.


פתרון
unsigned int strlen_without_h(const char str[])
{
  unsigned int i;
  unsigned int len_without_h = 0;

  for(i = 0; str[i] != 0; ++i)
    if(str[i] != 'h')
      ++len_without_h;

  return len_without_h;
}


פונקציה דומה ל-strcpy עריכה

כתוב פונקציה בשם strcpy_without_h המעתיקה מחרוזת אחת לשניה, למעט כל מופע של האות 'h'.


פתרון
void strcpy_without_h(char dest[], const char src[])
{
  unsigned int src_i, dest_i;

  for(src_i = 0, dest_i = 0; src[src_i] != 0; ++src_i)		
    if(src[src_i] != 'h')
      dest[dest_i++] = src[src_i];
      
  dest[dest_i++] = 0;  
}