Работает через одно место. Задача на СИ.
задание - отсортировать массив символов что бы с одной стороны были согласные и с другой гласные. Затем нужно это все отсортировать методом "прямой выбор" по возрастанию. (сам хз зачем ) вроде все сортирует но выводит раздельно. Сначала первая половина, а потом вторая но уже на следующей строке. Не понимаю что не так. Помогите пж .
#include <malloc.h>
#include <stdio.h>
int getarr(char *arr,const int size);
int sorting(char *arr,const int size);
int sortingsize(char *arr,const int size,const int middle );
int main()
{
int size;
scanf("%d",&size);size++;
char *arr = (char*)malloc((size) * sizeof(char));;
getarr(arr,size);
int x=sorting(arr,size);
sortingsize(arr,size,x);
for(int i = 0 ; i < size ; i++ ){
printf("%c",arr[i]);
}
return 0;
}
int getarr(char *arr,const int size){
for(int i = 0; i < size; i++) {
scanf("%c", &arr[i]);
}
return 0;
}
int sorting(char *arr,const int size){
int x=0;
char temp;
for (int i = 0;i<size;i++){
switch(arr[i]){
case 'A':
case 'a':
case 'E':
case 'e':
case 'I':
case 'i':
case 'O':
case 'o':
case 'U':
case 'u':
temp = arr[x];
arr[x]=arr[i];
arr[i]=temp;
x++;
break;
}
}
return x;
}
int sortingsize(char *arr,const int size,const int middle ){
char temp=0;
for(int i=0;i!=middle;i++){
for(int j=i;j<middle;j++){
if(arr[i]>arr[j]){
temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
for(int i=middle+1;i<size;i++){
for(int j=i;j<middle;j++){
if(arr[i]>arr[j]){
temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
return 0;
}

Я думаю, что сначала вам нужно переместить согласные вправо, а гласные влево, при этом сохранив их последовательность в слове и вывести результат. Затем отсортировать все буквы слова по возрастанию. Как-то так...
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 0x1000
_Bool is_vowel(char letter) {
const char* vowels = "AaEeIiOoUuYy";
size_t i = 0;
while (vowels[i]) {
if (letter == vowels[i]) return true;
++i;
}
return false;
}
int compare(const void* pa, const void* pb) {
char a = *((char*)pa);
char b = *((char*)pb);
if (is_vowel(a) && !is_vowel(b)) return 1;
if (!is_vowel(a) && is_vowel(b)) return -1;
return 0;
}
void consonants_and_vowels(char* word) {
qsort(word, strlen(word), sizeof(word[0]), compare);
}
void swap(char* pa, char* pb) {
char tmp = *pa;
*pa = *pb;
*pb = tmp;
}
void selection_sort(char* word) {
size_t n = strlen(word), i, k, j;
if (!n) return;
for (i = 0; i < n - 1; ++i) {
k = i;
for (j = i + 1; j < n; ++j) {
if (word[j] < word[k]) {
k = j;
}
}
swap(&word[i], &word[k]);
}
}
int main(void) {
char word[BUFFER] = {0};
printf("word: ");
scanf("%s", word);
consonants_and_vowels(word);
puts(word);
selection_sort(word);
puts(word);
return 0;
}
P.S. Явно задавать длину слова и создавать под него динамический массив не имеет смысла. Вряд ли вам нужно в консоль вводить слово длиннее, чем стек процесса, к тому же буфер консоли всё-равно значительно меньше.