Funkcja wczytująca napis w C

Witam.

Chciałem napisać funkcję, która wczyta napis od użytkownika i przekaże go do maina, aby następnie wyświetlić ten napis z funkcji main.

Napisałem coś takiego, ale nie działa i nie mam zielonego pojęcia dlaczego. Bardzo zirytowany tym faktem proszę was o pomoc gdyż nie jestem już w stanie myśleć.

Kod:

#include 

#include 


char* wczytaj(char* tekst){


	printf("Podaj napis:\n");

		scanf("%s",&tekst);



}


int main() {

	char* napis;

	wczytaj(napis);

	printf("%s",napis);



	return 0;

}

Proszę o pomoc i pozdrawiam

Piszesz funkcje, która zwraca wzkaźnik na char i przyjmujesz wskaźnik. Później deklarujesz wskaźnik, który na nic nie wskazuje(bo nawet w twoim kodzie nie ma na co wskazywać).

Wydaje mi się, że pisałeś ten kod bez wiedzy co to wskaźnik i do czego służy, a ten przykład spokojnie można by napisać bez użycia tego problematycznego elementu. Może warto się rozejrzeć za jakąś książką do C?

  1. Wskaźnik sam z siebie nie alokuje pamięci. Zmienna napis w main nie została zainicjalizowana żadną wartością, więc zawiera śmieci (to co znajdowało się w tym miejscu pamięci gdzie została umieszczona zmienna napis).

  2. W funckji wczytaj funckji scanf nie przekazujesz swojego argumentu tekst (który najpewniej powinien wskazywać na zaalokowany bufor), tylko wskaźnik do argumentu tekst. To co wpiszesz zostanie zapisane w zmiennej tekst ( nie w tym na co ona wskazuje), jeśli wpiszesz coś dłuższego to popsujesz sobie ramkę stosu.

Polecam obejrzeć http://www.youtube.com/watch?v=bewTJaboGIw, http://www.youtube.com/watch?v=1I0ObS-RQvQ, http://www.youtube.com/watch?v=ICrBkVxkdVI, http://www.youtube.com/watch?v=mqCULVvaS1c, http://www.youtube.com/watch?v=YvA8tNm0FbA, http://www.youtube.com/watch?v=B7x-RWNGhgc, http://www.youtube.com/watch?v=_5pfrvlY_cA, http://www.youtube.com/watch?v=OuJMvfwblb0,

+ możesz poczytać [http://www.uw-team.org/forum/viewtopic.php?f=7&t=9751&p=77955#p77955](http://www.uw-team.org/forum/viewtopic.php?f=7&t=9751&p=77955#p77955).

Na początku próbowałem bez wskaźników, po prostu zostawiając puste miejsce w nawiasach kwadratowych w zadeklarowanym charze:

mniej więcej tak

char napis[]

i podstawiałem wczytany napis do tego, ale wtedy kompilator wywalał mi że tu jest błąd.

Nie wiem. Jeśli możecie pokażcie mi jakiś przykład w sieci czy gdzieś… bo inaczej nie skapuję.

PS: Rolek0 dzięki za linki :slight_smile:

Nie możesz tak zdefiniować zmiennej bo kompilator musi znać rozmiary zmiennych. C nie jest zbyt wysokopoziomowym jezykiem i nie ma takich bajerów jak samorealokujące się tablice.

Taki zapis możesz zastosować w liście argumentów funkcji, ale nie oznacza on tego co byś chciał (klik, co prawda o C++ ale w C jest tak samo) :wink:

Spróbuj dać zmienna od napisu jako zmienna globalną, i wywołaj funkcje bez argumentu.

Polecam także do pobierania funkcje “std::cin >> zmienna;”, oraz zmienna dać typu “string”.

Proszę przykład:

#include 

#include 

using namespace std;

string napis;


int wczytaj();


int main(){

wczytaj();

cin.get(); 

}


int wczytaj(){

cin>>napis; //wczytanie

cout<
}

Polecam dokładniej przeczytać temat wątku :wink:

Możesz zmodyfikować funkcję wczytaj, tak aby zwracała typ void. Jako argumenty funkcji przyjmujesz: char tekst[], int maks_rozmiar). I w łańcuchu formatującym funkcji scanf dajesz odpowiednie zabezpieczenia. Oczywiście tablicę, którą przekazujesz musisz najpierw zadeklarować w funkcji main, podając konkretny rozmiar. Można również użyć dynamicznej alokacji pamięci z wykorzystaniem wskaźników (funkcje malloc i realloc).