В чём ошибка с указателем? (динамический массив, строки) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Условие задачи: Разделить символы из строки S1 на три группы: гласные, согласные, цифры. Группы разделить пробелами и отсортировать их по возрастанию. Пока что пытаюсь выделить из строки гласные и согласные буквы латинского алфавита. При запуске программы в массиве появляются лишние непонятные символы, не могу понять в чём ошибка, помогите, пожалуйста.
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <malloc.h>
  5. #include <conio.h>
  6. int main()
  7. {
  8. const int N=255;
  9. int i,j,z, n=0;
  10. char s1[N];
  11. char*b;
  12. printf("Input string\n");
  13. gets(s1);
  14. puts(s1);
  15. printf("%d\n",strlen(s1));
  16. for (i=0;i<strlen(s1);i++)
  17. if(isalnum(s1[i]))
  18. {
  19. printf("%c",s1[i]);
  20. n++;
  21. }
  22. printf("\n");
  23. //printf("%d\n",n);
  24. b=(char*)malloc(n*sizeof(char));//b 0xcccccccc <Неправильный указатель> char *
  25. //b 0x00884350 "НННээээ««««««««ю" char * при вводе ert
  26. for (i=0,j=0;i<strlen(s1);i++)
  27. {
  28. if(isalnum(s1[i]))
  29. {
  30. b[j]=s1[i];
  31. j++;
  32. printf("\nmassiv b: %s",b);
  33. }
  34. }
  35. z=strlen(b);
  36. //printf("\nmassiv b: %s",b);
  37. if (!b)
  38. {
  39. printf("Error\n");
  40. getch();
  41. return 1;
  42. }
  43. printf("%d",z);
  44. printf("\n");
  45. for (i=0;i<z;i++)
  46. {
  47. if(b[i]=='a'||b[i]=='e'||b[i]=='y'||b[i]=='u'||b[i]=='i'||b[i]=='o')
  48. printf("%c",b[i]);
  49. }
  50. printf("\n");
  51. for (j=0;j<z;j++)
  52. {
  53. if(isalpha(b[j])&&b[j]!='a'&&b[j]!='e'&&b[j]!='y'&&b[j]!='u'&&b[j]!='i'&&b[j]!='o')
  54. printf("%c",b[j]);
  55. }
  56. printf("\n");
  57. free(b);
  58. return 0;
  59. }

Решение задачи: «В чём ошибка с указателем? (динамический массив, строки)»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <malloc.h>
  5. #include <conio.h>
  6. int main()
  7. {
  8.     const int N=255;
  9.     int i,j,z, n=0;
  10.     char s1[N];
  11.     char*b;
  12.     printf("Input string\n");
  13.     gets(s1);
  14.     puts(s1);
  15.     printf("%d\n",strlen(s1));
  16.     for (i=0;i<strlen(s1);i++)
  17.     if(isalnum(s1[i]))
  18.     {
  19.         printf("%c",s1[i]);
  20.         n++;
  21.     }
  22.     printf("\n");
  23.    
  24.     //printf("%d\n",n);
  25.         b=(char*)malloc(n*sizeof(char));//b 0xcccccccc <Неправильный указатель> char *
  26. //b 0x00884350 "НННээээ««««««««ю"   char * при вводе ert
  27.         for (i=0,j=0;i<strlen(s1);i++)
  28.         {
  29.     if(isalnum(s1[i]))
  30.     {
  31.         b[j]=s1[i];
  32.         j++;
  33.     printf("\nmassiv b: %s",b);
  34.     }
  35.         }
  36.     z=strlen(b);   
  37.     //printf("\nmassiv b: %s",b);
  38.     if (!b)
  39.     {
  40.         printf("Error\n");
  41.         getch();
  42.         return 1;
  43.     }
  44.     printf("%d",z);
  45.     printf("\n");
  46.     for (i=0;i<z;i++)
  47.     {
  48.     if(b[i]=='a'||b[i]=='e'||b[i]=='y'||b[i]=='u'||b[i]=='i'||b[i]=='o')
  49.     printf("%c",b[i]);
  50.     }
  51.    
  52.     printf("\n");
  53.     for (j=0;j<z;j++)
  54.     {
  55.     if(isalpha(b[j])&&b[j]!='a'&&b[j]!='e'&&b[j]!='y'&&b[j]!='u'&&b[j]!='i'&&b[j]!='o')
  56.     printf("%c",b[j]);
  57.     }
  58.     printf("\n");
  59.    
  60.     free(b);
  61.     return 0;
  62. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы