Funkce vracející pole   zodpovězená otázka

C++/C

Dobrý den

Program má za úkol spojit dva řetězce zadané uživatelem. Ale hází mi to chybu: "Váš program vyvolal chybu segmentace(zápis nebo čtení z nepovolené části paměti)". Nevím čím to je. Podle mě asi tím že funkce vrací znakové pole.

#include <stdio.h>

#define A 100
#define B 0

char dohromady(char r1[A], char r2[A]);

int main()
{
    char r1[A], r2[A];
    printf("Zadejte 1 retezec: ");
    gets(r1);
    printf("Zadejte 2 retezec: ");
    gets(r2);
    
    printf("Text dohromady je %s", dohromady(r1, r2));
}

char dohromady(char r1[A], char r2[A])
{
     int posledni = 0;
     char p[A];
     
     //cyklus pro prvni retezec     
     for (int i = 0; i <= A; ++i){
         p[i] = r1[i];
         
         if (r1[i] == '\0'){
            posledni = i;
            i = A + 1;
         }
     }
     
     //czklus pro druhy retezec
     for (int i = 0; i <= A; ++i){
         p[posledni++] = r2[i];
         
         if (r1[i] == '\0'){
            i = A + 1;
         }
     }
     return p[A];
}

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Předpokládám, že po té funkci dohromady(char r1[A], char r2[A]) chcete, aby Vám vrátila ta dvě uživatelem zadaná slova jako jedno slovo. Podívejte se ale pořádně, co vracíte - stý prvek z pole p.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To vim, ale když tam napíšu třeba return r[] nebo return r tak mi to kompilátor neuzná. Já právě potřebuji vědět jak ta funkce má vrátit upravené pole.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Samozřejmě, že to kompilátorem neprojde - jestliže řeknete, že funkce vrací char (čili prostě opravdu jeden char), pak nemůžete vrace pole charů.

Jedním z řešení, jak tohle udělat, je, že hlavička (prototyp) funkce bude vypadat takto:

char* dohromady(char r1[100], char r2[100])

Tím prostě řeknete, že vracíte ukazatel na char. Pak u toho řádku s return dejte pryč to [A].

Pokud jsem něco zásadního nepřehlédl, tohle by mělo stačit, aby to fungovalo. Otázkou však je, jestli to chcete nutně psát v čistém C, neboť v C++ by bylo řešení výrazně jednodušší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Taky nefunguje, no zkusim to nějak zkutit. Na c++ navážu to se nebojte, protože teď mám c, protože to berem ve škole a navíc jsem si koupil knihu od Ritchieho a Karninghana.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V rychlosti jsem to zkompiloval v Linuxu a funguje to. Pokud používáte Visual Studio, tak v té funkci dohromady udělejte toto:

char* p = new char[200];  // radek misto char p[A]

Samozřejmě místo hodnoty 200 si tam můžete dát jinou. Hlavičku funkce nechte tak, aby funkce vracela pointer na char a ve funkci vracejte jen p, čili

return p;

Tohle už by opravdu fungovat mělo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Joooooo!!! Funguje to!!! KONEČNĚ!!! Diky moc

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
#include "stdafx.h"
#include "string.h"


char* nahrad(char pole[100]){  
	char* ukazatel;
	char novepole[100];
	ukazatel = novepole;
	for(int a=0;a<strlen(pole);a++){
		novepole[a]=pole[a];
	}
	novepole[strlen(pole)]='\0';

	for(int a=0;a<strlen(novepole);a++){
		if(pole[a]=='a') {novepole[a]='4';}
		else if(novepole[a]=='i') {novepole[a]='1';}
		else if(novepole[a]=='o') {novepole[a]='0';}
		else if(novepole[a]=='s') {novepole[a]='5';}
	}

	//tady když si ho vypíšu tak funguje
	printf("\n!!vypsani uvnitr fce %s !!\n",ukazatel);

	return ukazatel;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char pole[100];
	gets(pole);

	printf("\npretvorene pole: %s", nahrad(pole));

	fflush(stdin);
	getchar();
	return 0;
}

mohl by někdo poradit proč se mi v mainu nedaří vypsat řetězec, který vracím z funkce 'nahrad' pomocí ukazatele?

je to podobný příklad jak výše.

děkuji mockrát

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Protože vracíte ukazatel do lokálně alokovaného pole ve funkci nahrad.

novepole je vytvořeno na zásobníku, který ale po návratu z funkce může být přepsán čímkoliv, což se asi i děje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback