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

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

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

Условие задачи: Разделить символы из строки S1 на три группы: гласные, согласные, цифры. Группы разделить пробелами и отсортировать их по возрастанию. Пока что пытаюсь выделить из строки гласные и согласные буквы латинского алфавита. При запуске программы в массиве появляются лишние непонятные символы, не могу понять в чём ошибка, помогите, пожалуйста.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <conio.h>
int main()
{
    const int N=255;
    int i,j,z, n=0;
    char s1[N];
    char*b;
    printf("Input string\n");
    gets(s1);
    puts(s1);
    printf("%d\n",strlen(s1));
    for (i=0;i<strlen(s1);i++) 
    if(isalnum(s1[i])) 
    {
        printf("%c",s1[i]);
        n++;
    }
    printf("\n");
    
    //printf("%d\n",n);
        b=(char*)malloc(n*sizeof(char));//b 0xcccccccc <Неправильный указатель> char *
//b 0x00884350 "НННээээ««««««««ю"   char * при вводе ert
        for (i=0,j=0;i<strlen(s1);i++) 
        {
    if(isalnum(s1[i])) 
    {
        b[j]=s1[i];
        j++;
    printf("\nmassiv b: %s",b);
    }
        }
    z=strlen(b);    
    //printf("\nmassiv b: %s",b);
    if (!b)
    {
        printf("Error\n");
        getch();
        return 1;
    }
    printf("%d",z);
    printf("\n");
    for (i=0;i<z;i++)
    {
    if(b[i]=='a'||b[i]=='e'||b[i]=='y'||b[i]=='u'||b[i]=='i'||b[i]=='o')
    printf("%c",b[i]);
    }
    
    printf("\n");
    for (j=0;j<z;j++)
    {
    if(isalpha(b[j])&&b[j]!='a'&&b[j]!='e'&&b[j]!='y'&&b[j]!='u'&&b[j]!='i'&&b[j]!='o')
    printf("%c",b[j]);
    }
    printf("\n");
    
    free(b);
    return 0;
}

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

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <conio.h>
int main()
{
    const int N=255;
    int i,j,z, n=0;
    char s1[N];
    char*b;
    printf("Input string\n");
    gets(s1);
    puts(s1);
    printf("%d\n",strlen(s1));
    for (i=0;i<strlen(s1);i++) 
    if(isalnum(s1[i])) 
    {
        printf("%c",s1[i]);
        n++;
    }
    printf("\n");
    
    //printf("%d\n",n);
        b=(char*)malloc(n*sizeof(char));//b 0xcccccccc <Неправильный указатель> char *
//b 0x00884350 "НННээээ««««««««ю"   char * при вводе ert
        for (i=0,j=0;i<strlen(s1);i++) 
        {
    if(isalnum(s1[i])) 
    {
        b[j]=s1[i];
        j++;
    printf("\nmassiv b: %s",b);
    }
        }
    z=strlen(b);    
    //printf("\nmassiv b: %s",b);
    if (!b)
    {
        printf("Error\n");
        getch();
        return 1;
    }
    printf("%d",z);
    printf("\n");
    for (i=0;i<z;i++)
    {
    if(b[i]=='a'||b[i]=='e'||b[i]=='y'||b[i]=='u'||b[i]=='i'||b[i]=='o')
    printf("%c",b[i]);
    }
    
    printf("\n");
    for (j=0;j<z;j++)
    {
    if(isalpha(b[j])&&b[j]!='a'&&b[j]!='e'&&b[j]!='y'&&b[j]!='u'&&b[j]!='i'&&b[j]!='o')
    printf("%c",b[j]);
    }
    printf("\n");
    
    free(b);
    return 0;
}

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


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

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

9   голосов , оценка 3.667 из 5
Похожие ответы