8 svar
75 visningar
TB16 175
Postad: 7 aug 2019

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? 

Laguna 5368
Postad: 7 aug 2019

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. 

TB16 175
Postad: 7 aug 2019
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 

Laguna 5368
Postad: 7 aug 2019
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.

Affe Jkpg 4731
Postad: 7 aug 2019

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;

Affe Jkpg 4731
Postad: 8 aug 2019

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

TB16 175
Postad: 10 aug 2019
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;
}

Affe Jkpg 4731
Postad: 10 aug 2019

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.

TB16 175
Postad: 10 aug 2019
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 :) 

Svara Avbryt
Close