[C++] odczytywanie kodu odpowiedzi http


(M8 R Ias0ym) #1

Jak odczytać tablicy char z odebranego pakietu http

http 1.1 302 moved temporarily

liczbe 302 do int ??


(dobryteddy) #2
#include 

#include 

#include 

#include 


using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{

  int i=0, liczba=0;

  const int WIERSZ=6, KOLUMNA=25;

  char str[] = "http 1.1 302 moved temporarily";

  char temp[WIERSZ][KOLUMNA];

  char* pch = NULL;

  char* context = NULL;


  pch = strtok_s(str, " ", &context);

  strcpy_s(temp[i++], KOLUMNA, pch);

  while(i
  {

	pch = strtok_s(NULL, " ", &context);

	if(pch == NULL) {break;}

	else{

	     strcpy_s(temp[i++], KOLUMNA, pch);

	}

  }

  liczba = atoi(temp[2]);


  cout << liczba << "\n";


  return 0;

}

kod dla C++ w Visual 2008 EE


(Blapiter) #3

troche prosciej przy użyciu standardowych funkcji C

#include 

#include 


int main ()

{

	char str[] ="http 1.1 302 moved temporarily";

  	char * wsk = 0;

	short liczba = 0;  

  	wsk = strtok(str," ");  

  	while (wsk != NULL && liczba < 2)

  	{

    	++liczba;

		wsk = strtok (NULL, " ");

  	}	

	liczba = atoi(wsk);	

	printf("liczba: %d", liczba);

getchar();

return 0;

}

Lub już typowo w C++

#include 

#include 

#include 

int main(int argc, char *argv[])

{

char str[] ="http 1.1 302 moved temporarily";

 short liczba;

stringstream bufor;

string napis(str), pomin;

bufor << napis;

bufor >> pomin >> pomin >> liczba;

 cout<
cin.sync();

cin.get();

return 0;

}

(dobryteddy) #4

Niestety ten kod nie będzie działał prawidłowo, dlatego że 'wsk' zawsze będzie pokazywał ostatni wyraz z tej tablicy, czyli "temporarily". Dodatkowo użycie zmiennej "liczba" w pętli 'while' będzie niepotrzebne.

W moim kodzie po całej pętli, każdy wyraz będzie w osobnym wierszu 2-wymiarowej tablicy, co ułatwia sprawę.

Użyłem funkcji "strcpy_s" (podobnie jak strtok_s) a nie "strcpy" ze względu na to: warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.

UWAGA!! Poprawiłem nieco swój kod :slight_smile: Teraz powinien śmigać idealnie :smiley:


(Blapiter) #5

@dobryteddy Po pierwsze po co miałbym umieszczać kod który nie działa prawidłowo :smiley: ? (widzę że nawet go nie kompilowałeś skoro twierdzisz że nie działa ). Po drugie @schwarze.witwe pisze że chce odczytać z tak uformowanego stringa wartość która znajduje się na pozycji trzeciej, to znaczy nie interesuje go reszta powiadomienia. Co za tym idzie po co tworzyć do tego tablice marnując pamięć :lol: ?


(dobryteddy) #6

No fakt, nie przyjrzałem się za bardzo. Tak to jest jak się koduje w nocy :slight_smile:

Z tym marnowaniem pamięci to bym nie przesadzał, przecież dzisiaj standardem są 4 giga, to nie kiedyś że pamięć liczyło się w kilobajtach :smiley: Chyba, że komuś mocno na tym zależy. Mój przykład działa na ogólnym przypadku i faktycznie jeżeli komuś nie zależy na reszcie powiadomienia to faktycznie twój kod będzie lepszy :slight_smile:


(M8 R Ias0ym) #7
#include 

#include 

#include 

int main(int argc, char *argv[])

{

char str[] ="http 1.1 302 moved temporarily";

short liczba;

stringstream bufor;

string napis(str), pomin;

bufor << napis;

bufor >> pomin >> pomin >> liczba;

cout<
cin.sync();

cin.get();

return 0;

}

Nie działa wywala błąd:

`stringstream' undeclared (first use this function)