Łączenie charów

0

[code]char array1[6] = "nazwapliku.exe";
char array2[_MAX_PATH];[/code]

Pierwsza zmienna przechowuje stałą nazwę pliku. Druga zmienna przechowuje ścieżkę do tego pliku (ścieżkę katalogów). Ścieżka jest dynamiczna i dla każdego komputera inna, więc nie znam rozmiaru tej drugiej tablicy znaków.

Jak to połączyć?
W sensie: jak do array2 dokleić array1?

0

Właśnie robie małą aplikacje i musiałem ze stringów przenieść się na CHARY i stąd ten problem
Nie mogę importować <string.h> (bo zajmuje aż 100 kb~, a mi zależy na miniaturowym pliku ze pewnych względów) , dlatego to co podałeś - odpada.

0

Więc jeżeli chcesz to zrobić "na piechotę" to musisz znaleźć w tej tablicy znak '\0' - on oznacza koniec tekstu - reszta to śmieci. I od tego \0 zastępujesz wartościami z array1. Tylko nie zapomnij wstawić znaku końca na w ciągu wynikowym.

EDIT: Na przyszłość warto wspomnieć o swoich wymaganiach co do możliwości używania bibliotek.

0

No dobra, więc w jaki sposób w array2 znaleźć pozycję w której skończyły się litery i mogę dodawać pojedynczo znaki z array1?

0

Nie dam Ci gotowca... ale napiszę Ci jak to zrobić.

  1. W pętli sprawdzasz elementy ciągu array2 aż napotkasz na '\0'.
  2. Zapamiętujesz indeks pod jakim było to '\0'.
  3. W kolejnej pętli kopiujesz znaki z array1 do tablicy array2 zaczynając wstawiać do array2 począwszy od indeksu gdzie było '\0'.

To wszystko - myślę że jasno napisałem.

0

Ja rozumiem, nie chce gotowca przecież... potrzebuje tylko wiedzieć jaka funkcja jest odpowiedzialna za podanie właśnie tego znalezionego indeksu w tablicy.

3

OMG, jesli ty nie wiesz w jaki sposob petla for przeglada tablice i w jaki sposob sprawdzic dany znak to zacznij od jakiegos poradnika c++ dla poczatkujacych.

0

No to musisz się zdecydować czy chcesz używać tych bibliotek czy nie - jeżeli nie to użyj pętli, jeżeli tak to w pierwszej odpowiedzi masz odpowiednią funkcję.

0

[code]
int pozycja;
char array1[6] = "nazwapliku.exe";
char array2[_MAX_PATH];

for(int i=0; i <= _MAX_PATH; i++)
{
if(array2[i] == '\0') pozycja = i;
}
[/code]

Wyrzuca mi liczbę 251. A ścieżka ma może 40 znaków...

0

no przecież sam przed chwilą napisałeś że nie możesz skorzystać z takiej funkcji więc po co głupio pytasz?

0

Napisałem, że nie mogę użyć biblioteki string, a co ma string do tego co napisałem wyżej?

0

Po prostu krwq lubi sie czepiac slowek ;p Nie wiemy w jaki sposob jest pobierana ta sciezka do folderu, byc moze nie posiada ona na koncu znaku konca ciagu i musisz szukac do spacji lub innego znaku. Opcji jest wiele, a my wrozkami nie jestesmy.

0

Ścieżka to np.
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

w zależności od systemu operacyjnego. Jak znaleźć koniec takiego ciągu w tablicy znaków? Siedzę już nad tym 2 godzinę...

0

Jeżeli zależy ci na jak najmniejszym rozmiarze pliku wykonywalnego i nie chcesz cudować z nieużywaniem biblioteki standardowej C to zastanów się nad użyciem Windows Driver Kit. Jest to toolkit (zestaw nagłówków, bibliotek, narzędzi, w tym kompilatora), całkiem podobny do tego w Visual Studio. Jedną z różnic pomiędzy nimi jest właśnie biblioteka standardowa C. W przypadku Visual Studio, z każdą jego nową wersją, wydawana jest nowa wersja biblioteki standardowej. Aktualna (wewnętrzna) wersja Visual Studio to 10 i tak mamy msvcr100. W uproszczeniu mówiąc, każdy program, który używa biblioteki standardowej C, skompilowany przy użyciu domyślnego toolkitu w Visual Studio będzie wymagał tej biblioteki. Może ona być zlinkowana statycznie, wtedy nie trzeba dostarczać żadnych dodatkowych plików, ale rośnie nam waga pliku wykonywalnego - do ok. 50kb. No i statyczne linkowanie biblioteki standardowej nie jest polecane (gdyby wykryto w niej błąd i Microsoft wypuściłby poprawkę, twój program dalej by korzystał ze starej wersji). Jeżeli byłaby zlinkowana dynamicznie i w systemie nikt wcześniej by nie zainstalował "Visual Studio 2010 Runtime", aplikacja nie uruchomiłaby się.

Ale jest też "inna" biblioteka standardowa C, wydawana z każdą nową wersją systemu operacyjnego, nazywa się po prostu msvcrt i w każdym systemie ona jest, bo korzysta z niej właściwie każda aplikacja napisana przez Microsoft i prawie każdy sterownik. I właśnie aplikacja zbudowana przy pomocy WinDDK będzie korzystać właśnie z tej wersji biblioteki.

Przykładowy program:

#include <Windows.h>
#include <tchar.h>

int __cdecl main()
{
	TCHAR szFileName[] = _T("nazwapliku.txt");
	TCHAR szExecutablePath[MAX_PATH] = { 0 }, szPath[MAX_PATH] = { 0 };
	
	GetModuleFileName(NULL, szExecutablePath, MAX_PATH);
	
	LPTSTR lpszLastSlash = _tcsrchr(szExecutablePath, _T('\\'));
	
	if(lpszLastSlash == NULL)
		return 1;

	_tcsncat_s(szPath, szExecutablePath, lpszLastSlash - szExecutablePath + 1);
	_tcscat_s(szPath, szFileName);
	
	_tcprintf(_T("Nowa sciezka:\n%s\n"), szPath);

	return 0;
}

Jest to wyjątkowo nieprzenośna wersja C (C++ tak naprawdę), dedykowana tylko i wyłącznie na Windows, ale napisana z dość ścisłymi wytycznymi dla pisania kodu sterowników (stąd np. sprawdzenie czy w ścieżce znajduje się slash - niby powinien, ale powinniśmy sprawdzać wszystko).

I małe porównanie.

Toolkit Visual Studio 2011 Visual Studio 2010 WinDDK dla XP, Visty i 7 WinDDK dla 7 (na XP nie zadziała)
47.5 KB 43 KB 8.5 KB 5.5 KB
z upx 22 KB 21.5 KB 6.5 KB 4.5 KB
0
char array1[6]="n.exe";
char array2[MAX_PATH]=pobierz_Path("n.exe");
int index=0;
for(;array2[index] !='\0';index++);
for(int j=0;j<6;j++,index++)
array2[index]=array1[j];
array2[index+1]='\0';

Uwzględniłem że array1 ma 6 znaków bo tak masz w przykładzie, nie wspominając już że przypisujesz do niej dłuższy łańcuch...
pobierz_Path to funkcja która pobiera ścieżkę do pliku, ją już sam sobie zaimplementuj,

0

Błąd był banalny (zapomniałem zatrzymać sprawdzanie), już sobie poradziłem, dzięki wszystkim za udzielone odpowiedzi.

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