Przeszukiwanie char* za pomoca strstr() i użycie sprintf()

0

Mamy sobie wskaźnik na tablice. Problem polega na tym, że w tablicy czasami występuję więcej niż jeden znak \n. W związku z tym strstr() kończy szukanie w momencie napotkania \n. Ja oczywiście chciałbym przeszukać całą tablicę pod kątem szukanej frazy. Ponadto zastanawiam się jak na zaalakowaną konsolę wrzucić całą tablicę, a nie tylko jej fragment do pierwszego \n. Oczywiście przy próbie zabawy z sprintf() "pobiera" fragment do pierwszego \n. Mógłby mnie ktoś naprowadzić co muszę zrobić?

0

Skąd wytrząsnąłeś takie bzdury!? strstr przeszukuje cały c-string do znaku końca c-string'a czyli do znaku '\0';
Sprawdź to:
printf("%s\n",strstr("Ala\nma\nkota","kota"));
lub to;
printf("%s\n",strstr("Ala\nma\nkota","a\nk"));

0

Masz racje, że przeszukuje nawet po \n jednak pomyliłem się i mi chodziło właśnie o \0. Mając tablicę "test\0test1\0test2\0" szuka tylko do pierwszego t, a mi zależy aby przeszukało całość.

1

Przeważnie takie konstrukcje kończą się podwójnym "\0\0";

const char text[]="wiersz1\0wiersz2\0wiersz3\0";
for(const char *i=text;*i;i+=strlen(i)+1)
  {
   char *p=strstr(i,"sz");
   if(p) printf("znaleziono w pozycji %d\n",p-text);
  }

Jeżeli nie kończy się podwójnym '\0' to musisz znać rozmiar tego obszaru i zamiast:
;*i;
dac:
;i<text+sizeof(text);

0

Podpatrzyłem w hexie wybrany pakiet gdzie występuje więcej niż jedna linia i z tego co widzę to jest tam LF.

65 6e 74 2e 0a 73 61 79 -> ent..say

W związku z tym druga kropka (0a) jest \n aczkolwiek zastanawiam się dlaczego poprzedni przykład nie działa?

1

Może ten 'pakiet" nie ma znaku końca wiersza?

0

Ano nie ma :P Na końcu mamy oczywiście 0a. Jak dobrze wyprzedzam myślenie to aby prawidłowo to działało to na końcu musi znaleźć się \0

0

Zastanawiam się dlaczego taki myk nie przechodzi. Mając wspomniany wskaźnik i robiąc buf[len] = '\0' powinno ostatni element jak mniemam zamienić na to co chce jednak tak się nie dzieje.

Niby na własnym przykładzie to działa jednak w praktyce nie.

#include <iostream>

using namespace std;

int main()
{
	char a[] = {0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x73, 0x61, 0x79, 0x0a};
	char* buf = &a[0];
	buf[8] = '\0'; // bez tego strlen(buf) daje przykladowo wartosc 23 
	cout << buf << endl;

	system("PAUSE");
	return EXIT_SUCCESS;
}

[edit]
Z tego co zauważyłem to len przekazywany przez argument wskazuje mi na kosmicznie dużą liczbę (zupełnie nieprawdziwą). W przypadku użycia strlen() zwraca mi coś dalekiego od oczekiwań tzn. oblicza długość do napotkania pierwszego \n. Jest jakieś rozwiązanie tej sytuacji?

1

buf[len-1] = '\0';
bo len jest już poza przydzielonym obszarem.
Zawsze możesz napisać własny memstr:
char *memstr(char *str,char *ptr,unsigned srclen) { ...

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