Przekształcanie stringa wg podanych zasad

0

Witam
mam za zadanie napisać funkcję w języku C, która przekształci napis wejściowy wg podanych zasad: samogłoski po prawej stronie znaku | np. "|a\n"
spółgłoski po lewej stronie zaku np "b|\n"
przykład poniżej:
"Codewars", "C|\n|o\nd|\n|e\nw|\n|a\nr|\ns|"

kod poniżej:

#include <stddef.h>
// sorted has enough room for (strlen(string) * 3 + 1) characters
char *sort_vowels (const char *string, char *sorted)
{
  
  *sorted = '\0'; // write to sorted
  if(string==NULL)
    return sorted;
  int i;
  for(i=0;i<strlen(string);i++){
    char c=toupper(string[i]);
    if(c=='A'||c=='E'||c=='I'||c=='O'||c=='U')
      sprintf(sorted+strlen(sorted),"|%c\n",string[i]);
    else
      sprintf(sorted+strlen(sorted),"%c|\n",string[i]);
  }
  sorted[i*3-1]='\0';
  return sorted;
  }

Czy można ten kod napisać w jakiś prostszy i bardziej elegancki sposób.

0

Co znaczą te slash'e i pipe'y?
Piszesz coś o sortowaniu, ale jak zignorować \n i | to żadnego sortowania nie ma.
Może zamiast pisać swoja przetłumaczoną wersję zadania, lepiej podaj linka do oryginału na codewars.

0
Write a function which takes a input string s and return a string in the following way:

   
                  C|                          R|
                  |O                          n|
                  D|                          d|
   "CODEWARS" =>  |E       "Rnd Te5T"  =>      |
                  W|                          T|
                  |A                          |e
                  R|                          5|
                  S|                          T|

Notes:

List all the Vowels on the right side of |
List every character except Vowels on the left side of |
Return every character in its original case
Each line is seperated with \n
Invalid input ( undefined / null / integer ) should return an empty string
0

Tu jest link https://www.codewars.com/kata/59e49b2afc3c494d5d00002a/c
Zadanie po angielsku jest faktycznie napisane dość niezrozumiale, na dodatek samo zadanie ma niewielką wartość szkoleniową.

0

Da się to napisać w prostszy sposób?

3

Dobra daje ci rozwiązanie, bo jakość ego zdania pozostawia wiele do życzenia.
Przypuszczalnie autor zadania, ma wielkie ambicje i parcie na szkło, a sam jeszcze nie ma: ani dostatecznych umiejętności literackich, ani programistycznych, by stworzyć przyzwoite i sensowne zadanie, które czegokolwiek uczy.

  • zadanie jest źle napisane (od strony językowej)
  • wymuszone jest API, które mówi coś sortowaniu, którego nie ma.
  • y dla niego nie jest samogłoską
  • w specyfikacji zadania nie ma nic co ma być wartością zwracaną, a są na to testy (jest test, że ma być to samo co argument sorted)
  • by przejść testy ostatni znak ma nie mieć znaku końca linii (czego nie ma w opisie).

Moja rada, omijaj szerokim łukiem zdania od tego autora, bo zrobi ci tylko sieczkę w głowie.

#include <string.h>

int is_Vowel(char ch)
{
  static const char vowels[] = "aeiouAEIOU";
  for (size_t i = 0; i < sizeof(vowels) - 1; ++i) {
    if (ch == vowels[i]) return 1;
  }
  return 0;
}

// sorted has enough room for (strlen(string) * 3 + 1) characters
char *sort_vowels (const char *string, char *sorted)
{
  char *p = sorted;
  
  if (!string) {
    *sorted = 0;
    return sorted;
  }
  while (*string) {
    if (is_Vowel(*string)) {
      *p++ = '|';
      *p++ = *string;
    } else {
      *p++ = *string;
      *p++ = '|';
    }
    string++;
    if (*string) *p++ = '\n';
  }
  *p = '\0';
  return sorted;
}
1

To samo tylko mniej kombinowania.

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

void sort_vowels(const char *source,char *sorted)
{
	static const char vowels[]="aeiouAEIOU";
	for(int ch;(ch=*(source++))!='\0';)
	{
		int isvovel=(strchr(vowels,ch)!=NULL);
		if(!isvovel) *(sorted++)='|';
		*(sorted++)=ch;
		if(isvovel) *(sorted++)='|';
		*(sorted++)='\n';
	}
	*(sorted++)='\0';
}

int main()
{
	static const char test[]="CODEWARS";
	char sorted[100];
	sort_vowels(test,sorted);
	printf("%s",sorted);
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1