Połączenie napisów

Połączenie napisów
GR
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:13
0

Hej. Próbuję napisać funkcję łączącą 2 napisy oddzielone spacją w jednej tablicy. Wygląda to tak

Kopiuj
#include "stdafx.h"
#include <cstring>

char* PolaczNapisy (char* imie,char* nazwisko)
{
	int a,b,c;
	a = sizeof(imie);
	b = sizeof(nazwisko);
	c = a+b+1;
	char * tablica = new char[c];
	strcpy_s(tablica,sizeof(imie),imie);
	strcat_s(tablica,1," ");
	strcat_s(tablica,sizeof(nazwisko),nazwisko);
	return tablica;
}


int _tmain()
{
	char napis1 = "Imie";
	char napis2 = "Nazwisko";
	PolaczNapisy(napis1,napis2);
	return 0;
}
 

Niestety konsola wywala błędy, że nie może przekonwertować argumentów z maina ( char ) do wskaźników na chara w funkcji. Jak sobie z tym poradzić?

Kopiuj
 
Error	1	error C2440: 'initializing' : cannot convert from 'const char [5]' to 'char'	c:\users\filip\desktop\moja nauka c++\consoleapplication5\consoleapplication5\consoleapplication5.cpp	23
Error	2	error C2440: 'initializing' : cannot convert from 'const char [9]' to 'char'	c:\users\filip\desktop\moja nauka c++\consoleapplication5\consoleapplication5\consoleapplication5.cpp	24 

//EDIT
Dobra, nie ważne. zapomniałem przy napis1 i napis2 dodać []. Jednak teraz, gdy próbuję skompilować wyskakuje mi błąd programu
user image

edytowany 2x, ostatnio: Grafer
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
0
Kopiuj
    char *napis1 = "Imie";
    char *napis2 = "Nazwisko";
    char *razem = strcat(strcpy(new char[strlen(napis1)+strlen(napis2)+1],napis1),napis2);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
GR
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:13
0

Pracuje na Visualu 2012, gdzie obowiązują strcat_s i strcpy_s. strcat_s i strcpy_s biorą 3 argumenty. Tablica, do której ma zostać skopiowane, rozmiar tablicy oraz tablica, z której ma być skopiowana. Chciałem dodać 3 argument, ale niestety pogubiłem się trochę patrząc na Twój kod. Co mam dodać, zeby działało to pod Visuala 2012?

Co do błędu już chyba wiem o co chodziło. Używając sizeof program brał rozmiar wskaźnika, a nie samej tablicy. Trzeba było użyć strlen. Jednak mimo to program mi nie zadziałał.

edytowany 1x, ostatnio: Grafer
jackoi
  • Rejestracja:ponad 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Kraków
  • Postów:124
0

strcat_s, strcpy_s i inne z _s są funkcjami nie należącymi do standardu i nie powinno się z nich korzystać.
Porównaj sobie swój kod, z tym poniżej i zobacz gdzie zrobiłeś błędy:

Kopiuj
 
#include <cstdio>
#include <cstring>

char * PolaczNapisy(const char * imie, const char * nazwisko) {
    char * tablica = new char[strlen(imie) + strlen(nazwisko) + 2];
    
    strcpy(tablica, imie);
    strcat(tablica, " ");
    strcat(tablica, nazwisko);
    return tablica;    
}

int main() {
    const char * napis1 = "Imie";
    const char * napis2 = "Naziwsko";
    printf("%s\n", PolaczNapisy(napis1, napis2) );

    return 0;    
}

na szybko pisane :)

edytowany 2x, ostatnio: jackoi
_13th_Dragon
Za mało pamięci przydzielono.
Endrju
Te funkcje oczywiście należą do standardu, ale C. C11 konkretnie.
Endrju
No wątek jest o C++, ale te funkcje są ze standardu C11.
GR
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:13
0

Visual 2012 nie chce przepuścić zwykłych strcpy i strcat, gdyż mogą być niebezpieczne.

Kopiuj
Error	1	error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	c:/consoleapplication5.cpp	14
jackoi
  • Rejestracja:ponad 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Kraków
  • Postów:124
1

To na moją klawiature będzie tak, bo nie mam visuala zainstalowanego:

Kopiuj
int n = strlen(imie) + strlen(nazwisko) + 2;
strcpy_s(tablica, n, imie);
strcat_s(tablica, n, " ");
strcat_s(tablica, n, nazwisko); 

wzorując się na: http://msdn.microsoft.com/pl-pl/library/d45bbxx4.aspx
oraz: http://msdn.microsoft.com/pl-pl/library/td1esda9.aspx

edytowany 1x, ostatnio: jackoi
_13th_Dragon
"strcpy_s(tablica, strlen(tablica), imie);" - naprawdę? strlen() - na przed chwilą przydzielonej tablice? Access Violation - rawie gwarantowany.
GR
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:13
0

Wydaję mi się, że drugim argumentem jest rozmiar tablicy kopiowanej, a nie tej, do której się kopiuje.
Anyway, teraz znowu mi wypieprza błąd programu o zbyt małym buferze. Wina kodu, Visuala czy jakiś uprawnień na moim PC?
http://screenshu.com/static/uploads/temporary/yw/cm/9k/d386yb.jpg

jackoi
w linkach o strcat_s i strcpy_s są przykłady użycia, wypróbuj je

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.