wskaźnik na tablicę char

0

Witam, zaczynam swoją przygodę z C++, powoli czytam książkę "Język C++" Stephen Prata. Próbowałem przepisać do kompilatora jedno zadanie, jednak kompilator mi wyrzuca błąd (Visual Studio 2015). Oto kod, który mam:

#include <iostream>
#include <cstring>

using std::cout;
using std::cin;
using std::endl;

char * getname(void);

int main()
{
	char * name;

	name = getname();
	cout << name << " pod adresem " << (int*)name << "\n";
	delete [] name;

	name = getname();
	cout << name << " pod adresem " << (int*)name << "\n";
	delete [] name;

	system("pause");
	return 0;
}

char * getname()
{
	char temp[80];
	cout << "Podaj imie: ";
	cin >> temp;
	char * pn = new char[strlen(temp) + 1];
	strcpy_s(pn, strlen(temp), temp);

	return pn;
} 

Na początku kompilator nie pozwalał mi skopiować tablicy za pomocą strcpy i kazał użyć strcpy_s. Program uruchamia się jednak po wpisaniu imienia wywala błąd i rzuca mnie do linijki strcpy_s... Trochę szukałem w internetach jednak nie mogę znaleźć konkretnego rozwiązania... Może ktoś naprowadzić mnie na dobrą drogę?

0
  1. skoro korzystasz z VS15 to dodaj na pozcatku:
#define _CRT_SECURE_NO_WARNINGS
  1. nie musisz przepisywac wszystkiego z ksiazki. pobierz stad: http://helion.pl/przyklady/cppri6.zip
  2. z prototypow juz sie nie korzysta (?)
  3. wroc do funkcji z ksiazki:
char * getname() {
	char temp[80];
	cout << "Podaj imie: ";
	cin >> temp;
	char * pn = new char[strlen(temp) + 1];
	strcpy(pn,temp); //<<<< dlatego jest ten define

	return pn;
} 
0

Dzięki działa. A możesz mi powiedzieć dlaczego z prototypów się nie korzysta? To jak poprawniej to zrobić? Z tym przepisywaniem to jest tak że łatwiej mi się wtedy uczy jak przepiszę i sprawdzę jak działa...

1

@Craith nie wprowadzaj w błąd innych i to w ramach kompletnych podstaw, bo błaźnisz się po prostu.

Jak wywalisz z kodu prototyp funkcji getname to kompilator skąd ma wiedzieć co to jest getname w takim przypadku:

#include <iostream>
#include <cstring>
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    char * name;
 
    name = getname();
    cout << name << " pod adresem " << (int*)name << "\n";
    delete [] name;
 
    name = getname();
    cout << name << " pod adresem " << (int*)name << "\n";
    delete [] name;
 
    system("pause");
    return 0;
}
 
char * getname()
{
    char temp[80];
    cout << "Podaj imie: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy_s(pn, strlen(temp), temp);
 
    return pn;
} 

Jeśli chcesz pozbyć się propotypu to musisz dać tak:

#include <iostream>
#include <cstring>
 
using std::cout;
using std::cin;
using std::endl;
 
char * getname()
{
    char temp[80];
    cout << "Podaj imie: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy_s(pn, strlen(temp), temp);
 
    return pn;
} 
 
int main()
{
    char * name;
 
    name = getname();
    cout << name << " pod adresem " << (int*)name << "\n";
    delete [] name;
 
    name = getname();
    cout << name << " pod adresem " << (int*)name << "\n";
    delete [] name;
 
    system("pause");
    return 0;
}

Dopiero wtedy kompilator w funkcji main będzie wiedział że getname to jest funkcja.

A co jeśli mam kilka funkcji które trzymam w oddzielnym pliku i dołączam za pomocą #include wtedy daję w pliku *.h prototypy funkcji aby kompilator wiedział co i jak...

1 użytkowników online, w tym zalogowanych: 0, gości: 1