Hitta positionen i alfabetet
Uppgift:
When provided with a letter, return its position in the alphabet.
Input :: "a"
Ouput :: "Position of alphabet: 1"
--------
Sample tests:#include <criterion/criterion.h>
char* position(char);
Test(basicTests, should_pass_all_the_tests_provided) {
cr_assert_str_eq(position('a'), "Position of alphabet: 1");
cr_assert_str_eq(position('z'), "Position of alphabet: 26");
cr_assert_str_eq(position('e'), "Position of alphabet: 5");
}
Mitt försök att lösa uppgiften:
char* position(char alphabet)
{
char text[] = "Position of alphabet: X";
int digit = 98-alphabet;
text[22] = digit + '0';
char *ptr = text;
printf("%s", ptr); //Skriver ut 'Position of alphabet: 1' funktionen anropas med 'a' som parameter
return ptr;
}
Fråga:
printf skriver ut det förväntade resultatet enligt testfallen, men när jag kör koden så får jag följande felmeddelande: "The expression (as strings) (position('a')) == ("Position of alphabet: 1") is false." Någon som vet varför?
För z kan det inte bli rätt. Det fungerar bara för 1-9.
Men du kanske behöver skriva static framför deklarationen av text.
Laguna skrev:För z kan det inte bli rätt. Det fungerar bara för 1-9.
Men du kanske behöver skriva static framför deklarationen av text.
Genom att använda static så klarar jag första testet, men som du sa så funkar min kod inte för z. Skulle jag kunna använda strcat på något vis för tal större än 9?
Jag testade att skriva
strcat(text, digit + '0');
men det gick inte
TB16 skrev:Laguna skrev:För z kan det inte bli rätt. Det fungerar bara för 1-9.
Men du kanske behöver skriva static framför deklarationen av text.
Genom att använda static så klarar jag första testet, men som du sa så funkar min kod inte för z. Skulle jag kunna använda strcat på något vis för tal större än 9?
Jag testade att skriva
strcat(text, digit + '0');
men det gick inte
Du får tänka på att strängen kan ha två olika längder, beroende på om talet har en eller två siffror.
char *text = "Position of alphabet:";
static char str[30]; // Lite extra för att slippa räkna :-)
int digit = 98-(int)alphabet;
sprintf(str, "%s %d", text, digit); //Skapar text-strängen med två möjliga längder
printf( "%s", str); //Skriver ut "Position of alphabet: 1" när funktionen anropas med 'a' som parameter
return str;
För att fungera för annat än bara tecknet 'a', ska det väl stå:
int digit = (int)(alphabet-96); //Även casting av char till int
Annars enligt mitt föregående inlägg
Affe Jkpg skrev:För att fungera för annat än bara tecknet 'a', ska det väl stå:
int digit = (int)(alphabet-96); //Även casting av char till int
Annars enligt mitt föregående inlägg
Ja precis :) Jag lyckades lösa uppgiften, men testade även din lösning och den klarade alla test.
Min nya lösning:
char* position(char alphabet) {
int digit = alphabet - '`';
char numb[sizeof(digit)];
sprintf(numb, "%d", digit);
char *str = malloc(100 * sizeof(char));
strcpy(str, "Position of alphabet: ");
strcat(str, numb);
return str;
}
Som programmerare ska man vara försiktig när man använder malloc(). Varje exekvering av malloc() måste förr eller senare följas av en motsvarande free(), så att programmet återlämnar det allokerade minnesutrymmet. Nu tycks du ha skapat en subrutin som har en klassisk minnes-läcka, såvida inte anropande kod gör en free() efter varje anrop av position(). Man bör dock inte skriva en subrutin som ställer sådana krav på anropande kod.
Affe Jkpg skrev:Som programmerare ska man vara försiktig när man använder malloc(). Varje exekvering av malloc() måste förr eller senare följas av en motsvarande free(), så att programmet återlämnar det allokerade minnesutrymmet. Nu tycks du ha skapat en subrutin som har en klassisk minnes-läcka, såvida inte anropande kod gör en free() efter varje anrop av position(). Man bör dock inte skriva en subrutin som ställer sådana krav på anropande kod.
Okej, det skall jag försöka undvika om jag inte måste allokera minnesuttrymme vid en viss situation :)