Вопрос по С++

dreamer

Member
в некотором роде удобно, но не то что мне надо мне надо тупой набор символов запроса, а тут все разложено какбе по полочкам...)))
Структура запрос/ответ точно такая:
Код:
GET url HTTP/1.1
Заголовок: значение
Заголовок: значение

тело
 

-DEN-

New Member
Народ нужен совет - написал прогу типа калькулятора, но так как нехочетсо каждый раз её грузить нужно сделать так чтобы возможно было запускать её с командной строки с параметрами в виде выражения. Так вот я немогу никак сделать так чтобы символы читались из строки, а не из стандартного входного потока, если чемто поможете буду очень благодарен.
#include <ctype.h> // isspace
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>

jmp_buf g_env;
double g_vars['z' - 'a' + 1];
const char* g_s;

#define SPACES(s) while(isspace(*s)) ++s;

double statement(); // fwd

void expect(char expected, char c)
{
if (c == expected) return;
printf("Unexpected \'%c\'\n", c);
longjmp(g_env, -1);
}

double term()
{
double ret;
char* tmp;
SPACES(g_s);
if (*g_s >= 'a' && *g_s <= 'z')
return g_vars[*g_s++ - 'a'];
if (*g_s == '(') {
++g_s;
ret = statement();
SPACES(g_s);
expect(')', *g_s++);
return ret;
}
ret = strtod(g_s, &tmp);
if (tmp == g_s) expect('0', *tmp);
g_s = tmp;
return ret;
}

double subexpr()
{
double ret = term();
while (1) {
SPACES(g_s);
if (*g_s == '*') ++g_s, ret *= term();
else if (*g_s == '/') ++g_s, ret /= term();
else return ret;
}
}

double expr()
{
double ret = subexpr();
while(1) {
SPACES(g_s);
if (*g_s == '+') ++g_s, ret += subexpr();
else if (*g_s == '-') ++g_s, ret -= subexpr();
else return ret;
}
}

double assign()
{
const char* tmp;
unsigned idx;
SPACES(g_s);
if (*g_s >= 'a' && *g_s <= 'z') {
tmp = g_s + 1;
SPACES(tmp);
if (*tmp == '=') {
idx = *g_s - 'a';
g_s = tmp + 1;
return g_vars[idx] = assign();
}
}
return expr();
}

double statement()
{
double ret;
while(1) {
ret = assign();
SPACES(g_s);
if (*g_s != ',') return ret;
++g_s;
}
}

int main()
{
char buf[1024];
double ret;
setjmp(g_env);
while(1) {
g_s = gets(buf);
ret = statement();
expect('\0', *g_s);
printf("%g\n", ret);
}
return 0;
}
 

Cris

Member
я б помог, но немогу понять и найти в инете как считывать данные которые приходят в качестве параметра, в паскале там есть функция которая возврашает параметр отделенный пробелом с какимно номером, а в С++ как это делать?
и что вот это - setjmp(g_env);, я в инете почитал чтото про длинный переход и т.д но мало что понял)
 

dreamer

Member
параметры командной строки передаются в функцию мейн
точно названий не помню ... их вроде два... одни масив параметров второй изх каличиство
вообшем копай в этом направлении
Научитесь наконец поиском пользоваться!!!
 

Cris

Member
данный материал я читал даже более того использовал в написании проги, но всеже не смог по нему разобратсо с параметрами командной строки...
я разоюбрался, и переделал
вот код моей проги для получения параметров:
Код:
#include "iostream"
int main(int argc, char* argv[])
{
	int count=1;
	while(argc>count)
	{
		std::cout<<"Parametr #"<<count<<" - "<<argv[count]<<"\n";
		count++;
	}
	return 0;
}
как я понял параметром считаеться набор символов отделенныйх пробелами) когда проверял свою прогу)
 

xxxFAFNIRxxx

Вечный студент :)
Язык: Си
Задача: написать программу, которая анализирует лог-файл прокси-сервера squid и выводит на екран необходимую статистику. Имя лог-файла и остальные данные передаются как параметры командной строки.

Логи сквида выглядят вот таким образом:
Код:
40 192.168.0.25 TCP_MISS/404 670 GET http://traffic.maps.yandex.net/tiles/2000? DEFAULT_PARENT/127.0.0.1 text/html
293 192.168.0.16 TCP_MISS/404 343 GET http://cb.icq.com/cb/icqsrp/10/srp.cb? DEFAULT_PARENT/127.0.0.1 text/html
18 192.168.0.16 TCP_MISS/301 272 GET http://www.punto.ru/ DEFAULT_PARENT/127.0.0.1 text/html
298 192.168.0.16 TCP_MISS/404 343 GET http://cb.icq.com/cb/icqsrp/10/srp.cb? DEFAULT_PARENT/127.0.0.1 text/html
51 192.168.0.16 TCP_REFRESH_MISS/200 7403 GET http://punto.yandex.ru/ DEFAULT_PARENT/127.0.0.1 text/html
Программа выглядит вот так:
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define k 4
typedef char str120[120];
struct sqlgip{
   int a;
   int b;
   int c;
   int d;
};
struct sqlg {
   int elapsed;
   sqlgip ip;
   char status_http[100];
   int size;
   char method[10];
   char url[100];
   char hierstatus_hierhost[100];
   char type[25];
};
FILE *f;
int i,j,w;
str120 s[k];
sqlg mas[100];
sqlgip gg[100];
char u[100];
void main (int col, char *fname[40]){
w=0;
f=fopen(fname[1],"r");
if(f == NULL){
    puts("the end");
    return ;
}
for(i=0;i<k;i++){
   if(NULL==fgets(s[i],sizeof(s),f)){
	printf("Ne udalos schitat stroku");
   }
}
int a, b, c, d;
for(i=0;i<k;i++){
  sscanf(s[i],"%d%d.%d.%d.%d%s%d%s%s%s%s",&mas[i].elapsed,&a,&b,&c,&d,mas[i].status_http,&mas[i].size,mas[i].method,mas[i].url,mas[i].hierstatus_hierhost,mas[i].type);
  mas[i].ip.a = a;
  mas[i].ip.b = b;
  mas[i].ip.c = c;
  mas[i].ip.d = d;
}
int p;
for (w = 0; w < k; w++){
   for(i=0; mas[w].url[i] != '/'; i++);
   i++;
   p = 0;
   for(j=i+1;(mas[w].url[j] != '/') && ( mas[w].url[j] !='\0');j++){
  	u[p++]= mas[w].url[j];
   }
   strcpy(mas[w].url,u);
}
sscanf(fname[2],"%d.%d.%d.%d",&gg[0].a,&gg[0].b,&gg[0].c,&gg[0].d);
for(i=0;i<k;i++){
	if(((gg[0].a==mas[i].ip.a)&&(gg[0].b==mas[i].ip.b)&&(gg[0].c==mas[i].ip.c)&&(gg[0].d==mas[i].ip.d))){
		printf("%s\n",mas[i].url);
	}
}
fclose(f);
}
В командной строке мы вводим имя екзешника, имя лог файла и айпи. И оно должно вывести посещенные сайты с этого айпи. Проблема в том, что адреса сайтов выводит некоректно и цепляет части из названий других сайтов (см. вложение). Может найдеться добрый человек и посоветует как исправить. Заранее спасибо
 

Вкладення

Зверху