2012-01-18 13 views
8

Używam sprintf(newpath, "%s%s", cCurrentPath, "\\init.scm"); dodać \ init.scm do bieżącej ścieżki reż ale tam jest zwykle ostrzeżenie:Co to jest sprintf_s analog sprintf (newpath, "% s% s", ...)?

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

Sprintf_s nie obsługuje takiej "% s% s" string suma. Jak mogę to zrobić, używając sprintf_s?

+0

"Sprintf_s nie obsługuje takiej sumy ciągu"% s% s "? Jesteś pewny? (BTW, zazwyczaj nazywa się to konkatenacją, gdy mówimy o łańcuchach, a nie "suma".) – Mat

+0

tak, pokazuje ostrzeżenie C4024: "sprintf_s": różne typy dla formalnego i faktycznego parametru 2 \t i kończy się niepowodzeniem – Cynede

+0

To błąd w kodzie . – Mat

Odpowiedz

14

sprintf_s jest w zasadzie taka sama jak sprintf, ale robi kolejny parametr:

sprintf_s(newpath, sizeof(newpath), "%s%s", cCurrentPath, "\\init.scm"); 

Uwaga - jeśli newpath jest normalną tablicę znaków, sizeof(newpath) prace. Jeśli jest to wskaźnik lub tablica przekazana jako argument, może być potrzebny inny sposób uzyskania rozmiaru.
Można również użyć snprintf w tym samym celu w środowisku innym niż MS (choć działa inaczej).

+0

Ale% s% s jest sumą 2 ciągów, które przechodzą do nowej ścieżki. Jak to zrobić? – Cynede

+0

Funkcje _s są zbudowane dla bezpieczeństwa, więc nie próbujesz nadpisywać nieprzydzielonej pamięci. Z tego powodu drugi parametr musi być wielkością przydzielonej pamięci dla 1.paramu. Nie ma to nic wspólnego z następującymi parametrami, zapewnia, że ​​nie będzie naruszenia zasad dostępu do pamięci, jeśli faktyczny tekst będzie dłuższy niż oczekiwano. –

+0

Przepraszam, ale pominąłem ciąg formatu. Naprawione teraz, używasz go tak, jak napisałem. – ugoren