Kezdőoldal » Számítástechnika » Programozás » Hogyan tudom ezt kijavítani a...

Hogyan tudom ezt kijavítani a C programomban?

Figyelt kérdés

Sziasztok! Miért csinálja azt a programom, hogyha visszafelé nagybetűkkel akarom kiiaratni a Hello world! mondatom, akkor ezt kapom helyette: ômuco!DLROW OLLEH. Nem mindenhol ír ki az elejére ilyesmiket. Kipróbáltam a Hogy vagy?-gyal is, az eredmény: ômucoD\?YGAV YGOH. Hogyan tudom kijavítani ezt a hibát a C programomban? Miért csinálja, és hogyan javítható?


#include <stdio.h>

#include <string.h>


char* reverse(const char* text)

{

char *copy = (char*)malloc(strlen(text) + 1); // Helyet csinál a kópiának.

int i = 0;


do{

copy[i]=toupper(text[i]); //Átesz mindent nagybetűvé.

i++;

}while( text[i] != '\0' );

strrev(copy); //Átalakítja visszafelé.

return copy;

if (text==NULL) //Ha a megadadott szöveg NULL, akkor térjen vissza a NULL értékhez.

return NULL;

}


int main()

{

const char* text="Hello world!";

char* reversed = reverse(text);

printf("\nBefore: %s\nAfter: %s\n",text,reversed);

// "!DLROW OLLEH"

free(reversed);

}



2016. márc. 19. 14:58
1 2
 1/12 anonim ***** válasza:
Hiányzik a sztringed végéről a \0, így egészen addig írja ki a memóriában a sztring után található random értékeket, amíg egy véletlenszerű 0-ba nem botlik.
2016. márc. 19. 15:34
Hasznos számodra ez a válasz?
 2/12 A kérdező kommentje:
Hm, hogy ez nem jutott az eszembe. Köszönöm kedves válaszoló! Hogyan fogalmazzam át, akkor a while-t?
2016. márc. 19. 15:37
 3/12 anonim ***** válasza:

Azt talán sehogy.

A stringed végét egészítsd ki (termináld) egy nullával. (\0)

2016. márc. 19. 15:45
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:

Nem az a lényeg, bár én egy for ciklust használnék:


for (int i = 0; i < strlen(text); i++)


A megoldás a copy után ez:

buffer[strlen(text)] = '\0'


Egyébként más problémát is látok, többeközt deadcode-ot.

2016. márc. 19. 15:46
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:

size_t i;

for(i = 0; i <= strlen(text); i++) {

copy[i] = toupper(text[i]);

}


Mindemellett sok más hiba is van a kódban amibe bele lehetne kötni.


1. String literal típusa char* nem cont char*

2. Nem szoktunk függvényen belül foglalni területet és azzal visszatérni, a buffert argumentumba szokás átadni

3. strrev() nem a standard része, nem működik minden rendszeren, a szöveg megfordítására vannak egyszerűbb módok is.

4. return copy; utáni kód soha nem fog lefutni.

5. A már említett do while ciklus feltétele logikailag hibás

6. A toupper a <ctype.h>-ban van deklarálva


Ha manuálian másolnád át mindezt akkor még gyorsabb is lenne mert egy ciklus alatt elintézed a megfordítást és a nagybetűvé alakítást.

2016. márc. 19. 15:54
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:
Nem vizsgáltam, de ránézésre látszik, hogy a megcélzott feladathoz képest túlsúlyos a progi.
2016. márc. 19. 15:56
Hasznos számodra ez a válasz?
 7/12 A kérdező kommentje:
Köszönök minden választ! Átcsináltam for ciklusra úgy, hogy for(i=0;i<strlen(text)+1+i++). Így már jól működik. Köszönöm az ötletet, egyébként mit jelent az, hogy deadcode, még nem hallottam ezt a kifejezést. Miért lenne a kódom halott?
2016. márc. 19. 16:00
 8/12 A kérdező kommentje:
Javítva: for(i=0;i<strlen(text)+1;i++)
2016. márc. 19. 16:07
 9/12 anonim ***** válasza:

A return utáni nullos rész soha semmilyen körülmények közt nem fog lefutni.

A használaton kívüli kódot nevezzük halottnak.

2016. márc. 19. 16:14
Hasznos számodra ez a válasz?
 10/12 A kérdező kommentje:
És azt úgy megoldhatom, hogy if (text==NULL) return NULL; else {maga a függvény}
2016. márc. 19. 16:24
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!