8 svar
366 visningar
TB16 182 – Fd. Medlem
Postad: 7 aug 2019 17:32

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 Online 30472
Postad: 7 aug 2019 17:45

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 182 – Fd. Medlem
Postad: 7 aug 2019 18:27
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 Online 30472
Postad: 7 aug 2019 21:56
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 6630
Postad: 7 aug 2019 23:16

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 6630
Postad: 8 aug 2019 10:54

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 182 – Fd. Medlem
Postad: 10 aug 2019 15:58
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 6630
Postad: 10 aug 2019 20:27

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 182 – Fd. Medlem
Postad: 11 aug 2019 00:45
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
Close